我有一个程序的以下部分,它模拟了一个非常基本的菜单。
while (true) {
int selection;
try {
selection = scanner.nextInt();
} catch (Exception e) {
selection = -1;
}
switch (selection) {
case 0:
System.exit(0);
default:
System.out.println("No valid selection!");
}
}
现在,每当我输入而不是整数时,selection
都会设置为-1
并打印错误消息。但是,循环无休止地继续,Scanner
不等待任何输入。
我怎么告诉它再等一下?如何在格式错误的用户输入上更优雅地失败呢?
答案 0 :(得分:6)
当Scanner
无法读取某些内容时,违规数据 从流中删除,这意味着任何后续读取都将再次失败,直到数据被清除。
要解决此问题,您可以在失败时阅读并忽略结果:
try {
selection = scanner.nextInt();
} catch (Exception e) {
selection = -1;
scanner.next(); // discard the input
}
答案 1 :(得分:1)
在您的情况下,不确定抛出和捕获异常是否相关。
尝试:
boolean isValid = false;
int selection;
while(!isValid) {
isValid = scanner.hasNextInt();
if(!isValid) {
System.out.println("No valid selection!");
scanner.next();
} else {
selection = scanner.nextInt();
}
}
if(selection == 0) {
System.exit(0);
}
答案 2 :(得分:-3)
让一些用户输入退出/中断while循环。就像用户在循环停止时进入“退出”一样。
除此之外,您还可以执行以下操作:
catch (Exception e) {
selection = -1;
}
switch (selection) {
case 0:
System.exit(0);
default:
System.out.println("No valid selection!");
System.out.println("Try again!");
selection = scanner.nextInt();
}