所以我必须通过扫描仪获取输入。我试图让程序在用户输入非整数值时不断要求用户提供有效的输入。以下是我试图实现这一目标的方式。
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)
我在这里做错了什么?
第一个问题是Scanner抛出异常时会发生什么。Java文档中写道:
当扫描程序抛出InputMismatchException时,扫描程序不会传递导致异常的令牌,因此可以通过其他方法检索或跳过它
所以这就是为什么你对nextInt的第二次调用会抛出另一个异常——它试图重新读取同一个令牌。如果你想丢弃它,你可以直接打电话给next。
第二个问题是,您的代码只允许用户重新输入一次值。如果他们第二次打字错误,你就倒霉了。我建议这样做:
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);
}
}