0
0

続:.next()と.nextLine()の違いと、初心者向けのScannerの解説

Posted at

前書き

超初心者向けの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

▼実際の動き

個人名を消すモザイクを入れているため、見づらくて申し訳ありません……
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への理解を深めていきます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0