Java 为什么我得到一个输入无效的无限循环?

Java 为什么我得到一个输入无效的无限循环?,java,exception,java.util.scanner,infinite-loop,inputmismatchexception,Java,Exception,Java.util.scanner,Infinite Loop,Inputmismatchexception,当最初的选择无效时,为什么这会让我陷入无休止的循环 while (true) { System.out.print("Choice:\t"); try { int choice = scanner.nextInt(); break; } catch (InputMismatchException e) { System.out.println("Invalid Input!"); } } 输出: Choice: d

当最初的选择无效时,为什么这会让我陷入无休止的循环

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!
从:

当扫描器抛出异常时,扫描器不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌


因此,
“df”
字符串仍在扫描仪中。您必须通过调用
next()
或其他方法以某种方式清除它。

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.
    }
}

只在try子句中打断while语句。当你的while循环进入catch时,它只是不打破循环

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

你必须把
break
放在
finally
子句中。在
catch
子句中放一个
break
。但是
while(true)
循环的目的是什么呢?请将
break
也放入
catch
clause.+1以供正式的JavaDoc参考并解释原因。谢谢这一直困扰我一段时间。