1. ホーム
  2. java

[解決済み】スキャナはnext()またはnextFoo()を使用した後、nextLine()をスキップしていますか?)

2022-02-22 14:55:42

質問

を使用しています。 Scanner メソッド nextInt()nextLine() は入力の読み込み用です。

こんな感じです。

System.out.println("Enter numerical value");    
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string"); 
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)

問題は、数値を入力した後、最初の input.nextLine() はスキップされ、2番目の input.nextLine() が実行され、次のような出力になりました。

Enter numerical value
3   // This is my input
Enter 1st string    // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string    // ...and this line is executed and waits for my input

アプリケーションをテストしてみたところ、問題は input.nextInt() . これを削除すると string1 = input.nextLine()string2 = input.nextLine() が思い通りに実行される。

どのように解決するのですか?

それは Scanner.nextInt メソッドは 改行 という文字が入力されます。 Scanner.nextLine を読み込んだ後に戻ります。 改行 .

を使用した場合にも、同様の動作が発生します。 Scanner.nextLine の後に Scanner.next() または任意の Scanner.nextFoo メソッド(ただし nextLine そのもの)になります。

回避策

  • を置くか Scanner.nextLine の後に Scanner.nextInt または Scanner.nextFoo を含むその行の残りを消費します。 改行

    int option = input.nextInt();
    input.nextLine();  // Consume newline left-over
    String str1 = input.nextLine();
    
    
  • あるいは、さらに良い方法は、入力を読み通すことです Scanner.nextLine で、入力を必要な適切な形式に変換します。例えば、整数に変換するには、次のようにします。 Integer.parseInt(String) メソッドを使用します。

    int option = 0;
    try {
        option = Integer.parseInt(input.nextLine());
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    String str1 = input.nextLine();