所以我必须通过扫描仪接收输入。我正在尝试让程序在输入非整数值时继续询问用户输入有效值。以下是我试图实现这一目标的方法。
System.out.println("Enter an integer");
Scanner input = new Scanner(System.in);
int level=0;
try{
level=input.nextInt();
}catch(InputMismatchException e){
System.out.println(e+". Enter a valid entry!");
level=input.nextInt();
}
问题是如果用户输入了一个字符,程序不会让用户输入另一个整数。程序停止并在catch块中打印出print语句以及:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at Main.main(Main.java:20) (which is level=input.nextInt(); in the catch block)
我在这里做错了什么?
答案 0 :(得分:5)
第一个问题是Scanner抛出异常时会发生什么。 Java文档说:
“当扫描程序抛出InputMismatchException时,扫描程序不会传递导致异常的标记,因此可以通过其他方法检索或跳过它”
这就是为什么你对nextInt的第二次调用会抛出另一个异常 - 它试图重新读取相同的令牌。如果你想丢弃它,你可以直接打电话。
第二个问题是您的代码只允许用户重新输入一次值。如果他们第二次输入错误的东西你就不走运了。我建议这样的事情:
int level = 0;
boolean gotLevel = false;
while (!gotLevel) {
try {
level = input.nextInt();
gotLevel = true;
} catch (InputMismatchException e) {
System.out.println("Error. " + input.next() + " is not a valid integer:" + e);
}
}