質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

274閲覧

Javaで1行目は数値のみ、2行目は文字と数値のコードのエラーを解決したい

rinen791

総合スコア1

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2024/05/10 03:04

編集2024/05/10 04:59

実現したいこと

1行目に2行目以降の行数を入力、1行目を命令数は最小値以上、最大値未満。

2行目からは1行目に入力した数値分の行数を入力。
2行目以降は文字と数値が混合で半角スペースで区切られる。

SET 数値 数値
ADD 数値
SUB 数値

入力される数値は(SETの場合だけ最後の数値)最小値以上、最大値未満。

SETの場合SET 1なら変数1に後続で入力される値の数値を代入。
SETの場合SET 2なら変数2に後続で入力される値の数値を代入。
ADDの場合は変数1の値にADDの数値を足した値を変数2に代入。
SUBの場合には変数1の値にSUBの数値を引いた値を変数2に代入。

これをの計算した値を
変数1 変数2
のように出力したい。

発生している問題・分からないこと

java初心者です。
課題をやってエラー文を解消できないのでお教えいただけたら嬉しいです。

2行目の入力にどうしてもならなくて原因がよくわかりません・・・。
2行目の切り出しがうまくいかず想定しているif文にならず、どういうことなのかわかりません。

エラーメッセージ

error

1Index 1 out of bounds for length 1

該当のソースコード

java

1import java.util.Scanner; 2 3public class Project4 { 4 public static final int MEIREISU_MIN = 0; 5 public static final int MEIREISU_MAX = 10; 6 public static final int HENSU_MIN = -1000; 7 public static final int HENSU_MAX = 1000; 8 public static void main(String[] args) { 9 Scanner sc = new Scanner(System.in); 10 11 System.out.println("命令数を入力して下さい。"); 12 int Meireisu = sc.nextInt(); 13 14 /*Meireisuが最小値以上最大値未満か*/ 15 if (Meireisu < MEIREISU_MIN || Meireisu > MEIREISU_MAX ) { 16 System.out.println("命令数は" + MEIREISU_MIN + "以上" + MEIREISU_MAX + "以下で入力してください。"); 17 } 18 19 try { 20 /*変数用意*/ 21 int i = 1; 22 int Atai = 0; 23 int Value = 0; 24 int hensuOne = 0; 25 int hensuTwo = 0; 26 27 /*Meireisuで入力した値だけ繰り返す*/ 28 while (i < Meireisu) { 29 /*2行目を半角スペース入力しNameとAtaiに分割*/ 30 String[] hensu = sc.nextLine().split(" "); 31 String Name = hensu[0]; 32 Atai = Integer.parseInt(hensu[1]); 33 34 /*NameがSETならまだ分割してない値をValueに*/ 35 if (Name == "SET") { 36 Value = Integer.parseInt(hensu[2]); 37 } 38 39 /*数値が最小値以上最大値未満か*/ 40 if (Value < HENSU_MIN || HENSU_MAX > Value) { 41 throw new Exception("値は" + HENSU_MIN + "以上" + HENSU_MAX + "未満で入力してください。"); 42 } 43 else if (Atai < HENSU_MIN || HENSU_MAX > Atai) { 44 throw new Exception("値は" + HENSU_MIN + "以上" + HENSU_MAX + "未満で入力してください。"); 45 } 46 47 /*Nameの文字によって計算*/ 48 switch (Name) { 49 case "SET": 50 if (Atai == 1) { 51 hensuOne += Value; 52 } 53 else if (Atai == 2) { 54 hensuTwo += Value; 55 } 56 break; 57 case "ADD": 58 hensuTwo += hensuOne + Atai; 59 break; 60 case "SUB": 61 hensuTwo += hensuOne - Atai; 62 break; 63 } 64 i++; 65 } 66 /*変数1と変数2の出力*/ 67 System.out.println(hensuOne + " " + hensuTwo); 68 } 69 catch (Exception e) { 70 System.out.println(e.getMessage()); 71 } 72 finally { 73 sc.close(); 74 } 75 } 76}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

1行目は入力できていて2行目の入力に行かない原因が調べててもいまいちわかりません。
.split(" ")でスペース区切りで入力できると思ったのですが、その後の入力したものの値の切り分けが良くないのか具体的にソースコードをどう修正すればいいのか分からないです。

無事にエラーは解決しました!
別の問題が起きていて模索しています・・・。

補足

初質問、初心者です。質問する上での基本的なルールなど分からないので、質問内容やコードの書き方などで不足していたら申し訳ございません。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2024/05/10 04:21

ソースコードを囲む始まりの 「```」 を 「```java」 とすると、行番号が付いたり色が付いたりして見易くなりますので是非お試しください。
rinen791

2024/05/10 04:48

お教えいただきありがとうございます! 次からそのようにします!
jimbe

2024/05/10 05:28

編集有難う御座います。 文字列の比較は、「java 文字列 比較」等で検索してみては如何でしょうか。
guest

回答1

0

ベストアンサー

sc.nextInt() の実行では、その数値に続く改行コードを消費しません。よって、その直後に sc.nextLine() を呼ぶと長さ0の文字列(入力の2行目ではなく1行目の残り)が返ります。

java

1 int Meireisu = sc.nextInt(); 2 sc.nextLine();

などとして1行目の改行コードを読み捨てるとよいでしょう。

投稿2024/05/10 03:16

int32_t

総合スコア21421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rinen791

2024/05/10 04:47

返信ありがとうございます! 無事にエラーは解消しました! 初歩的で申し訳ありません。 表題ではないんですが、以下の部分でValueにhensu[2]が入らずelse ifに進んでしまいます・・・ ```java /*NameがSETならまだ分割してない値をValueに*/ if (Name == "SET") { Value = Integer.parseInt(hensu[2]); } /*数値が最小値以上最大値未満か*/ if (Value < HENSU_MIN || HENSU_MAX > Value) { throw new Exception("値は" + HENSU_MIN + "以上" + HENSU_MAX + "未満で入力してください。"); } else if (Atai < HENSU_MIN || HENSU_MAX > Atai) { throw new Exception("値は" + HENSU_MIN + "以上" + HENSU_MAX + "未満で入力してください。"); } ``` このように書き換えてみたんですがそれでもいかずどこがいけないのでかお教えいただけませんでしょうか・・・。 ```java /*NameがSETならまだ分割してない値をValueに*/ if (Name == "SET") { Atai = Integer.parseInt(hensu[1]); Value = Integer.parseInt(hensu[2]); /*数値が最小値以上最大値未満か*/ if (Value < HENSU_MIN || HENSU_MAX > Value) { throw new Exception("値は" + HENSU_MIN + "以上" + HENSU_MAX + "未満で入力してください。"); } }else { Atai = Integer.parseInt(hensu[1]); } if (Atai < HENSU_MIN || HENSU_MAX > Atai) { throw new Exception("値は" + HENSU_MIN + "以上" + HENSU_MAX + "未満で入力してください。"); } ```
int32_t

2024/05/10 05:00

別の問題なので、別の質問を新たに立ててください。
rinen791

2024/05/10 05:53

失礼しました! そういたします、お教えいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問