【java】nextInt()のあとにnextLine()するとスキップされる現象

はじめての記事です。気合いれましょう。シャオラ。

【現象】nextInt()のあとにnextLine()を書くとスキップされる

①例えばこのようなコードがあるとします。(Scannerクラスは”scanner”としてimportしてある状態)

System.out.println("あなたの名前を入力してください。");
String name = scanner.nextLine();
System.out.println("あなたの年齢を入力してください。");
 int age = scanner.nextInt();
System.out.println("あなたの性別を入力してください。");
String gend = scanner.nextLine();
System.out.println("おわり");

②すると以下のような結果になります。

あなたの名前を入力してください。
(入力待ち)
あなたの年齢を入力してください。
(入力待ち)
あなたの性別を入力してください。
おわり

「性別」のString入力がスキップされてしまうんですね。さぁなぜだ。

今は nextLine() → nextInt() → nextLine() の順ですが、
「年齢」と「性別」を聞く順番を入れ替えて
nextLine() → nextLine() → nextInt() にすると正常に動作します。なぜだ。

【なぜこんなことに】nextInt() の動きがなんか独特だったから

よくScannerで使うnextなんちゃらには、
nextLine() 、 nextInt() 、 next() なんかがありますが、
このnext達は打ち込まれた文字列の読み込み方が統一されてないみたいですね。つらい。

さぁ nextInt() → nextLine() と入力したときのjavaの中身を見てみましょう。

例えば「123(改行)」を入力すると
nextInt() で、「123」だけが読み込まれ、「(改行)」がScannerの中に残ってしまいます。
なぜなら nextInt() には、文字列を読み込んだあとに改行を削除する機能がないためです。(これが原因だった)

続いて nextLine() が実行されますが、先ほどの「(改行)」が残っているので文字列が入力されたもんだと思い込みます。
そしてなにも打ち込まれていない文字列部分を読み込み、残っていた「(改行)」を消して終了します。

そうです。nextLine() には、文字列を読み込んだあとに改行を削除する機能がついているんです。

実行した結果をみるとスキップされたように見えちゃうんですが、
実はからっぽの文字列を読み込んでいたんですね。

知ればなるほど。納得です。
きっとnext達の読み込み方に違いがあるのはなにか理由があるんでしょうね。

やっぱり書くと覚えられますね!
頑張りましょう。

この記事が気に入ったらサポートをしてみませんか?