代码下方
margin-right
如果第一个用户输入引发异常,则不会停止下一个用户输入。
我如何理解上述代码中的这个问题?将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()
可以解决问题。但是我还不清楚引擎盖下发生了什么?解决这个问题的正确方法是什么?
答案 0 :(得分:2)
当nextXYZ()
无法使用令牌时,它会将其留在InputStream
中。在这里,你无休止地循环相同的输入 - 每次迭代,你试图使用这个标记,如果它不是一个整数,就会抛出一个异常,抓住它,并再次尝试读取它 - 永远。
编辑:
为了解决这个问题,您可以使用next()
来使用该令牌并转到下一个令牌:
for(;;) {
System.out.print(prompt);
try{
choice = sc.nextInt();
break;
} catch(java.util.InputMismatchException ex) {
sc.next(); // here
}
}
答案 1 :(得分:2)
Scanner next()
的问题是,如果找不到匹配,它们将无法前进。失败的角色仍留在流中。因此,如果您发现了非预期的角色,那么推进扫描仪非常重要。
您可以使用实际消耗任何字符的next()
方法,也可以使用 skip 方法传递跳过模式。
使用hasNext()
了解是否存在有效匹配。如果没有,则使用上述方法消耗该字符。
答案 2 :(得分:0)
如果它没有在下一个上找到一个int,它会抛出一个错误。然后程序会捕获此错误,因此永远不会触发中断,因为只要找到非int(包括空),错误就会跳过它。