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

5

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

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个回答

14

根据Scanner API文档所述:

当扫描仪抛出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
    }
}

谢谢!我之前不知道Scanner上的那个小细节,现在它可以工作了 :D - Daniel Oliveira

4

一种替代@LukeLee的解决方案

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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接