为什么这会导致我在初始选择无效时陷入无限循环?
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!
答案 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;
}
}