嘿伙计们,我有以下的循环似乎没有停止。应该问用户一个小时。我正试图抓住用户没有输入数字的事件。
即。 输入小时:foo 您没有输入有效值
然后它应该允许用户再次输入一小时的值,但它会一遍又一遍地打印错误消息
private static void setTime(Clock clock){
int hours = -1;
int minutes = -1;
int seconds = -1;
Scanner scanner = new Scanner(System.in);
while(true)
{
try{
System.out.print("Enter hours: ");
hours = scanner.nextInt();
}
catch(NumberFormatException nfe){
System.out.println("Input was not an integer, please try again");
continue;
}
catch(InputMismatchException ims){
System.out.println("Input was not an integer, please try again");
continue;
}
break;
}
}
答案 0 :(得分:4)
将Scanner scanner = ...
移至while循环中。
答案 1 :(得分:2)
来自文档:
当扫描仪抛出时 InputMismatchException,扫描程序 不会传递导致的令牌 例外,这样可能 通过其他方式检索或跳过 方法
在重新启动循环之前,您必须阅读错误的答案,否则它会一次又一次地读取相同的内容。
根据文档nextInt()
,永远不会返回NumberFormatException
,因此无需对其进行测试。
你也可以像这样使用hasNextInt()
:
while(true) {
if(scanner.hasNextInt()) {
hours = scanner.nextInt();
break;
} else {
scanner.next();
System.out.println("You must enter an integer");
}
}
答案 2 :(得分:1)
您可以在打印例外后添加scanner.nextLine();
。
要明确:
try{
System.out.print("Enter hours: ");
hours = scanner.nextInt();
}
catch(NumberFormatException nfe){
System.out.println("Input was not an integer, please try again");
scanner.nextLine();
continue;
}
catch(InputMismatchException ims){
System.out.println("I--nput was not an integer, please try again");
scanner.nextLine();
continue;
}
break;
答案 3 :(得分:1)
您是否首先尝试从扫描器读取字符串,然后尝试将其解析为整数?
e.g。
String line = scanner.nextLine();
hours = Integer.parseInt(line);
答案 4 :(得分:1)
这是因为如果解析成功,则scanner.nextInt()仅移动到下一个标记(请参阅Javadoc)。