为什么使用nextInt()的代码会永远循环?



代码下面,

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(不包括任何值),错误就会跳过它。

最新更新