7

このコードは、ユーザーから整数を取得してプログラムを終了することになっています。ユーザーが無効な番号を入力すると、ユーザーに再度尋ねます。

例外をキャッチした後Scanner.reset()、スキャナーをリセットするために使用しますが、機能しません。そして、以前の例外を再スローします。

Scanner in = new Scanner(System.in);
while (true) {
    try {
        System.out.print("Enter an integer number: ");
        long i = in.nextLong();
        System.out.print("Thanks, you entered: ");
        System.out.println(i);
        break;
    } catch (InputMismatchException ex) {
        System.out.println("Error in your input");
        in.reset(); // <----------------------------- [The reset is here]
    }
}

Scanner.reset()すべてをリセットして例外を忘れると思いました。ユーザーに新しい入力を求める前にそれを置きます。

私がポイントを間違えた場合、正しい方法は何ですか?

4

2 に答える 2

11

メソッドの目的を誤解してresetいます。スキャナに関連付けられた「メタデータ」(空白、区切り文字など)をリセットするためのものです。入力の状態を変更しないため、探しているものを達成できません。

必要なのは の呼び出しです。これは、からnext()すべてを読み取り、破棄します。StringScanner

try {
    System.out.print("Enter an integer number: ");
    long i = in.nextLong();
    System.out.print("Thanks, you entered: ");
    System.out.println(i);
    break;
} catch (InputMismatchException ex) {
    System.out.println("Error in your input");
    in.next(); // Read and discard whatever string the user has entered
}

例外的な状況をキャッチするために例外に依存することは問題ありませんが、同じ問題に対するさらに優れたアプローチは、次のようhas...にメソッドを呼び出す前にメソッドを使用することです。next...

System.out.print("Enter an integer number: ");
if (!in.hasNextLong()) {
    in.next();
    continue;
}
long i = in.nextLong();
System.out.print("Thanks, you entered: ");
System.out.println(i);
break;
于 2013-04-12T13:51:02.853 に答える
3

Scanner.reset () javadocによると、このメソッドはロケール、基数、および区切り記号の設定のみを「リセット」します。すでに読み取ったデータには何もしません。

于 2013-04-12T13:51:02.077 に答える