为什么我输入无效无限循环?

时间:2014-03-14 22:18:42

标签: 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: 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!

3 个答案:

答案 0 :(得分:9)

来自Javadoc

  

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

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

答案 1 :(得分:4)

扫描程序试图一遍又一遍地解析并返回相同的令牌(并且它不是整数,因此它会抛出异常)。您可以通过丢弃无效令牌来修复它:

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

答案 2 :(得分:1)

你只在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;
  }
}