43

私はこのようなものを持っています:

    Scanner in=new Scanner(System.in);
    int rounds = 0;
    while (rounds < 1 || rounds > 3) {
        System.out.print("How many rounds? ");
        if (in.hasNextInt()) {
            rounds = in.nextInt();
        } else {
            System.out.println("Invalid input. Please try again.");
            System.out.println();
        }
        // Clear buffer
    }
    System.out.print(rounds+" rounds.");

どうすればバッファをクリアできますか?

編集:私は以下を試しましたが、何らかの理由で機能しません:

while(in.hasNext())
    in.next();
4

6 に答える 6

45

これを試して:

in.nextLine();

これにより、スキャナーが次の行に進みます。

于 2012-05-15T15:38:16.807 に答える
17

Scannerのバッファを明示的にクリアすることはできません。内部的には、トークンが読み取られた後にバッファをクリアする場合がありますが、これは、ポーグラマーの手の届かない実装の詳細です。

于 2012-05-15T15:39:36.957 に答える
12

次のコマンドを使用します。

in.nextLine();

直後の

System.out.println("Invalid input. Please Try Again.");
System.out.println();

または次の中括弧の後(それに関するあなたのコメントはどこにありますか)。

このコマンドは、スキャナーを次の行に進め(ファイルまたは文字列から読み取る場合、これは単に次の行を読み取るだけです)、この場合は基本的にそれをフラッシュします。バッファーをクリアし、スキャナーに新しい入力の準備をします。これは、ユーザーが無効な入力(数字を求められたときの文字など)を入力したときに現在のバッファーをクリアするために使用できることが好ましい。

メソッドのドキュメントはここにあります:http: //docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine()

お役に立てれば!

于 2014-08-28T07:35:50.297 に答える
7

これで修正されるはずです...

Scanner in=new Scanner(System.in);
    int rounds = 0;
    while (rounds < 1 || rounds > 3) {
        System.out.print("How many rounds? ");
        if (in.hasNextInt()) {
            rounds = in.nextInt();
        } else {
            System.out.println("Invalid input. Please try again.");
            in.next(); // -->important
            System.out.println();
        }
        // Clear buffer
    }
    System.out.print(rounds+" rounds.");
于 2014-05-06T06:47:20.280 に答える
6

他の人々はin.nextLine()、単一行入力で機能するバッファをクリアするために使用することを提案しました。ただし、コメントが指摘しているように、System.in入力が複数行になる場合があります。

代わりに、他のInputStreamではなくSystem.inを使用している場合は、バッファーをクリアする新しいScannerオブジェクトを作成できます。

in = new Scanner(System.in);

これを行う場合は、最初に電話しないでください。in.close()そうすることでSystem.inが閉じられるため、その後のin.nextInt();System.inの呼び出しでNoSuchElementExceptionsが発生します。おそらく、プログラム中に閉じるべきではありません。

(上記のアプローチはSystem.inに固有です。他の入力ストリームには適さない場合があります。)

新しいオブジェクトを作成する前に本当にScannerオブジェクトを閉じる必要がある場合、このStackOverflowの回答は、ラップされたSystem.inストリームを閉じない独自のclose()メソッドを持つSystem.inのInputStreamラッパーを作成することを提案します。ただし、これは単純なプログラムにはやり過ぎです。

于 2019-05-07T23:02:46.920 に答える
0
scan.nextLine();

文字列入力を読み取る前に上記の行を入力してください

于 2021-05-11T09:04:11.037 に答える