Java尝试捕获,直到没有抛出异常

时间:2016-11-03 01:51:14

标签: java exception

我正在尝试使用扫描程序和无限循环从用户获取整数。我知道解决这个问题的解决方案,但我一直想知道为什么我的第一种方法不能正常工作?

Scanner myScanner = new Scanner(System.in);
int x = 0;
while(true){
    try{
        System.out.println("Insert a number: ");
        x = myScanner.nextInt();
        break;
    }catch(InputMismatchException e){
        System.out.println("Invalid, try again.");
        continue;
    }
}

它适用于第一次迭代,但它只是继续打印"无效,再试一次"在屏幕上永远。

2 个答案:

答案 0 :(得分:9)

来自Scanner API doc

  

当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致异常的标记,因此可以通过其他方法检索或跳过它。

因此无效令牌仍然存在,导致另一个异常而另一个异常......另一个......

Scanner myScanner = new Scanner(System.in);
int x = 0;
while(true){
    try{
        System.out.println("Insert a number: ");
        x = myScanner.nextInt();
        break;
    }catch(InputMismatchException e){
        System.out.println("Invalid, try again.");
        myScanner.next(); // skip the invalid token
        // continue; is not required
    }
}

答案 1 :(得分:4)

@LukeLee's solution的替代方案:

Scanner myScanner = new Scanner(System.in);
int x = 0;
while(true){
    try{
        System.out.println("Insert a number: ");
        x = Integer.parseInt(myScanner.next());
        break;
    }catch(NumberFormatException e){
        System.out.println("Invalid, try again.");
        // continue is redundant
    }
}