代码下面,
import java.util.Scanner;
public class Dummy {
static Scanner sc = new Scanner(System.in);
public static int getIntegerInput(String prompt){
int choice = 0;
for(;;){
System.out.print(prompt);
try{
choice = sc.nextInt();
break;
}catch(java.util.InputMismatchException ex){
System.out.print("What??? ");
}
}
return choice;
}
public static void main(String[] args) {
int choice = getIntegerInput("Enter a number: ");
} //end main
}
如果第一个用户输入引发异常,不会在下一个用户输入时停止。
我如何理解这个问题在上面的代码?将sc.next()
置于catch
中解决了这个问题。但我还是不清楚到底发生了什么?解决这个问题的正确方法是什么?
当nextXYZ()
消耗令牌失败时,将其留在InputStream
中。在这里,您正在无限地循环相同的输入—每次迭代,您都尝试使用该令牌,如果它不是整数,则抛出异常,捕获它,并尝试再次读取它—直到永远。
编辑:
为了解决这个问题,您可以使用next()
来使用该令牌,然后移动到下一个:
for(;;) {
System.out.print(prompt);
try{
choice = sc.nextInt();
break;
} catch(java.util.InputMismatchException ex) {
sc.next(); // here
}
}
Scanner next()
的问题是,如果没有找到匹配,它们将不会前进。而它没能胜任的角色仍留在溪流中。因此,如果您发现了不需要的字符,那么推进扫描器是非常重要的。
你可以使用next()
方法,它实际上消耗任何字符,或者你可以使用skip方法传递跳过模式。
使用hasNext()
来判断是否存在有效匹配。如果没有,则使用上述方法消费该字符。
如果在下一个类中没有找到int类型,则抛出错误。这个错误随后会被你的程序捕获,所以永远不会碰到break,因为只要发现一个非int(不包括任何值),错误就会跳过它。