无限循环当在try-catch块中捕获InputMismatchException时

时间:2011-07-07 15:07:53

标签: java exception-handling try-catch infinite-loop java.util.scanner

我一直在无限循环中捕获我的代码。

没有什么可以提升的,但我无法理解我的生活!

有人请帮忙

我完全没有创建特定的错误,而没有我在实际程序中的所有if语句。

    package bs;

    import java.util.InputMismatchException;
    import java.util.Scanner;

    public class bs {

        public static void main(String[] args) {

            Scanner sc = new Scanner(System.in);

            boolean continueVar = true;

            while (continueVar) {

                try {
                    System.out.println("Enter Something");
                    int input = sc.nextInt();

                } catch (InputMismatchException i) {
                    System.out.println("What the f***?");
                    continueVar = true;
                }
            }


        }
    }

捕获输入不匹配异常时会发生无限循环。我认为它至少会要求用户重新输入他们的输入,但不是这样做,而是继续循环,如下所示:

    run:
    Enter Something
    df
    What the f***?
    Enter Something
    What the f***?
    Enter Something
    What the f***?

它只是忽略了扫描仪对象sc?!

4 个答案:

答案 0 :(得分:5)

没有跳过扫描仪,它只是从输入的开始处开始。来自JavaDoc:

  

如果翻译成功,扫描仪将超过匹配的输入。

这意味着如果转换不成功,扫描仪将无法前进。因此,您只需使用next()手动跳过错误的输入。

编辑:在尝试阅读输入之前,您可能需要检查hasNextInt()

答案 1 :(得分:0)

在continueVar为true时循环,但是你永远不会设置为false,所以循环永远不会退出。

我认为你想在异常处理程序中将continueVar设置为false。

答案 2 :(得分:0)

  

当扫描仪抛出时   InputMismatchException,扫描程序   不会传递导致的令牌   例外,这样可能   通过其他方式检索或跳过   方法

导致不匹配的令牌仍在扫描仪的缓冲区中。在尝试再次扫描之前,您需要清除它。

你可以通过调用catch块中的next()来实现这一点,如下所示:

catch (InputMismatchException i) {
    System.out.println("What the f***?");
     sc.next();           
}

此外,您无需再次将continueVar设置为true。你永远不会把它设置为假,所以它将保持真实。猜猜这是你把它移到迷你程序中的神器。

答案 3 :(得分:0)

找到错误令牌时,扫描程序无法前进。请查看Scanner.java,第2095-2096行:

catch (NumberFormatException nfe) {
    position = matcher.start(); // don't skip bad token