为什么这个代码使用nextInt()永远循环?

时间:2015-07-24 17:59:44

标签: java java.util.scanner

代码下方

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()可以解决问题。但是我还不清楚引擎盖下发生了什么?解决这个问题的正确方法是什么?

3 个答案:

答案 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(包括空),错误就会跳过它。