前書き
超初心者向けのScannerの話です。
.next()と.nextLine()の違いと、初心者向けのScannerの解説の記事の続きとなりますので、未読の方はこちらもご参考いただけると嬉しいです。
それでは、前回コメントアウトしていた部分のコメントアウトを外し、実行してみましょう。
▼コード
import java.util.Scanner;
public class ScannerNextMethod {
public static void main(String[] args) {
Scanner scNext = new Scanner(System.in);
String a = scNext.next();
String c = scNext.next();
String d = scNext.nextLine();
System.out.println("a:" + a);
System.out.println("c:" + c);
System.out.println("d:" + d);
Scanner scNextLine = new Scanner(System.in);
String b = scNextLine.nextLine();
String e = scNextLine.next(); //前回コメントアウトしていた箇所
System.out.println("b:" + b);
System.out.println("e:" + e); //前回コメントアウトしていた箇所
scNext.close();
scNextLine.close();
}
}
▼出力結果
aaaa bbbb cccc
a:aaaa
c:bbbb
d: cccc
aaaa bbbb cccc
aaaa bbbb cccc
b:aaaa bbbb cccc
e:aaaa
▼実際の動き
Java_ScannerMovie pic.twitter.com/N1vFeyWMKX
— Mori Miki (@Morizo_Mikkoro) August 6, 2024
個人名を消すモザイクを入れているため、見づらくて申し訳ありません……
Line15のあと、Line16実行時に入力待ちが発生していることにご注目ください!
詳細説明
Scanner scNextLine = new Scanner(System.in);
scNextLineにユーザーが入力したものを全スキャンして入れています。
String b = scNextLine.nextLine();
scNextLineに入っているものを、改行コードまで読み込んで変数bに入れています。
これにより、
System.out.println("b:" + b);
で改行までの「aaaa bbbb cccc」全てが出力されます。
上記で、scNextLineに入っていた全てを変数bに渡しているため、scNextLineは未読込のものがない状態となっています。
そのため、
String e = scNextLine.next(); //前回コメントアウトしていた箇所
が実行された際、ユーザーの入力待ちとなります。
このコードは、scNextLineに入っているものを、空白(スペース)まで読み込んで変数eに入れています。そのため、下記の
System.out.println("e:" + e); //前回コメントアウトしていた箇所
が実行されたときの出力結果は「e:aaaa」となります。
まとめ
- Scannerは、コピー機のスキャナー機能のように、指定されたものを全て読み込む
- .next()は空白(スペース)まで、.nextLine()は改行までを読み取る
- 未読込のものがないときは入力待ちとなる
後書き
最初はインスタンス生成時にのみ、入力を受け取っているのだと勘違いしていたのですが、実際のところは、読み込むものがないときも入力待ち状態になっていたんですね。
これを理解しないまま、Scannerをリセットするために無闇に.next()や.nextLine()を記述して、Enterを押さないとプログラムが進行しない、なんてことも発生していたので、ようやく謎が解けた気分です。
.next()と.nextLine()の違いについても知ることができたので、色々なコードを書いて、更にJavaへの理解を深めていきます!