2

最初の選択が無効な場合、これにより無限ループに陥るのはなぜですか?

while (true) {
    System.out.print("Choice:\t");
    try {
        int choice = scanner.nextInt();
        break;
    } catch (InputMismatchException e) {
        System.out.println("Invalid Input!");
    }
}

出力:

Choice: df
Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
Choice: Invalid Input!
4

3 に答える 3

9

Javadocから:

スキャナーがInputMismatchExceptionをスローすると、スキャナーは例外の原因となったトークンを渡さないため、他の方法でトークンを取得またはスキップできます。

したがって、"df"文字列はまだスキャナにあります。呼び出すnext()か、その他の方法で、何らかの方法でクリアする必要があります。

于 2014-03-14T22:21:59.057 に答える
4

Scanner は、同じトークンを何度も解析して返そうとしています (これは整数ではないため、例外がスローされています)。無効なトークンを破棄することで修正できます。

while (true) {
    System.out.print("Choice:\t");
    try {
        int choice = scanner.nextInt();
        break;
    } catch (InputMismatchException e) {
        System.out.println("Invalid Input!");
        scanner.next();                         // here, discard invalid token.
    }
}
于 2014-03-14T22:22:10.153 に答える
1

while ステートメントを try 句でのみ中断します。while ループが catch に入ると、ループが中断されません。

while (true) {
  System.out.print("Choice:\t");
  try {
    int choice = scanner.nextInt();
  } catch (InputMismatchException e) {
    System.out.println("Invalid Input!");
  }
  finally {
   break;
  }
}
于 2014-03-14T22:22:21.137 に答える