目次
この記事は3分ほどで読めます。
1. 入力ができない場合のコード例
2. 原因
3. 解決方法
4. おわりに
1. 入力ができない場合のコード例
package develop;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
// 年齢読み取り
System.out.println("あなたの年齢を入力してください");
int age = scanner.nextInt();
System.out.println("年齢「" + age + "」");
// 名前読み取り
System.out.println("あなたの名前を入力してください");
String name = scanner.nextLine();
System.out.println("名前「" + name + "」");
// 所属部署読み取り
System.out.println("所属部署を入力してください");
String department = scanner.nextLine();
System.out.println("部署名「" + department + "」");
System.out.println("ご入力ありがとうございました");
}
}
}
これをコンソール上で実行していくと、、
あなたの年齢を入力してください
25
年齢「25」
あなたの名前を入力してください
名前「」
所属部署を入力してください
営業部
部署名「営業部」
ご入力ありがとうございました
となり、名前の入力をしたいのに省略されてしまいます。
2. 原因
- このような動作になる理由は「
nextInt()
の次にnextLine()
の処理を呼び出しているため」です。-
nextInt()
は「改行するまでの値を読み込み、改行は読み込まない」メソッドです。 - 対して
nextLine()
は「改行するまでの値と、改行を読み込む」メソッドです。たとえ改行のみの場合であっても...です。
-
- 今回の例では年齢を「25」と登録する際に、
nextInt()
で「25改行」と打ち込みます。 - すると
nextInt()
は「25」だけを読み込み「改行」を内部データとして残したままの状態にします。 -
nextLine()
は改行までの値と改行を読み取るため、「改行」がデータとして送られてきた時点で、読み取りを終了します。
文字だけだと「なんのこっちゃ」となりますが、コードと照らし合わせると、案外簡単なロジックです。
System.out.println("あなたの年齢を入力してください");
// 25と入力しEnterキーを押す(つまり「25 + 改行」の内部データを保持する)
// nextIntは改行を読み取らないためageは25となる。
// ただしnextIntは改行を放置するため、内部データとして「改行」を保持することになる。
int age = scanner.nextInt();
System.out.println("年齢「" + age + "」");
System.out.println("あなたの名前を入力してください");
// この時点で内部データに「改行」が残っているため、それを読み取り終了。nameは改行となる
// 改行を読み取ったため、内部データとしては何も保持していない。
String name = scanner.nextLine();
System.out.println("名前「" + name + "」");
System.out.println("所属部署を入力してください");
// 内部データを保持していないため、こちらのnextLine()の入力は問題なくできる。
String department = scanner.nextLine();
System.out.println("部署名「" + department + "」");
- 補足
- 今回の例で登場していませんが、
scanner.next()
というメソッドもあります。 -
next()
もnextInt()
と同じく「改行するまでの値を読み込み、改行は読み込まない」メソッドです。 - つまり今回の例の
nextInt()
をnext()
に変更しても、nextLine()
で名前の登録が省略されてしまいます。(ぜひ試してみてください!)
- 今回の例で登場していませんが、
3. 解決方法
- 2種類の解決策をお伝えします
- 「改行」を読み込むための
nextLine()
を追加する -
nextLine()
ではなくnext()
を使う
- 「改行」を読み込むための
「改行」を読み込むためのnextLine()
を追加する
System.out.println("あなたの年齢を入力してください");
int age = scanner.nextInt();
// 改行を読み込むために追加。内部データから改行を削除する
scanner.nextLine();
System.out.println("年齢「" + age + "」");
System.out.println("あなたの名前を入力してください");
// 内部データがないため、入力可能になる。
String name = scanner.nextLine();
System.out.println("名前「" + name + "」");
// ・・・
- この方法が他サイトでもよく紹介されている方法です。
- ただ、開発者頼りになる手法です。scanner.nextLine()を追加忘れによる、動作不良が発生する可能性があります。(scanner.nextLine()を追加せずともエラーにならないので、追加忘れをしたときの原因解明が厄介です)
nextLine()
ではなくnext()
を使う
// ・・・
System.out.println("所属部署を入力してください");
// nextLine()からnext()に変更
String department = scanner.next();
System.out.println("部署名「" + department + "」");
System.out.println("所属部署を入力してください");
// nextLine()からnext()に変更
String department = scanner.next();
System.out.println("部署名「" + department + "」");
-
nextLine()
ではなくnext()
でも同じ処理ができる場合、next()
に統一することで改行について気にする必要性が減少します。 - scanner.close()されるまで「改行」が内部データとして残っていることは頭の片隅に入れておきましょう。
- 補足
-
nextLine()
は空白を認識させることができます。「テスト タロウ」というように空白を活用したい場合に使用しょう。(next()
でも記述次第で同じような処理にできますが、他の人がコードを見た際に「あ、空白もOKなのね」とコードの可読性が上がるのでnextLine()
と使い分けましょう)
-
- 筆者はこの方法を個人的におすすめします。
4. おわりに
いかがだったでしょうか。
next()
,nextInt()
,nextLine()
「どれがどういう処理だったかな~」とこの記事を都度閲覧し、活用してみてください。
これからもプログラム初心者の方に寄り添った投稿を行ってまいります。
「いいね & フォロー」いただけますと大変励みになります!