Java 在try-catch块中捕获InputMidmatchException时无限While循环

Java 在try-catch块中捕获InputMidmatchException时无限While循环,java,exception-handling,try-catch,infinite-loop,java.util.scanner,Java,Exception Handling,Try Catch,Infinite Loop,Java.util.scanner,我一直让我的代码陷入无限的while循环 这是什么先进,但我不能想出它为我的生活 谁来帮忙 我只是有意地重新创建了特定的错误,而没有实际程序中的所有if语句 package bs; import java.util.InputMismatchException; import java.util.Scanner; public class bs { public static void main(String[] args) {

我一直让我的代码陷入无限的while循环

这是什么先进,但我不能想出它为我的生活

谁来帮忙

我只是有意地重新创建了特定的错误,而没有实际程序中的所有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

当continueVar为true时循环,但从未设置为false,因此循环永远不会退出


我想您应该在异常处理程序中将continueVar设置为false。

否扫描程序不会被跳过,它只是从输入的开始处开始。从JavaDoc:

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

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

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

当扫描器抛出 输入不匹配异常,扫描仪 不会传递导致错误的令牌 例外情况,以便 通过其他方式检索或跳过 方法

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

您可以在catch块中调用
next()
,如下所示:

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

此外,您不需要再次将
continueVar
设置为true。你从不把它设为假,所以它将保持真实。猜测这是您将其删除到迷你程序中的产物。

当发现坏令牌时,扫描仪不会前进。查看Scanner.java,第2095-2096行:

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

您在代码中从未将continueVar设置为false,因此无论是否存在异常,您总是会有一个无限循环。@Anthony我想他在问更多关于它为什么不重置scanner对象并持续捕获异常的问题。@Daniel我理解,这就是为什么我发表评论而不是回答-我无法帮助解决实际问题,但可以指出代码中的逻辑错误,在他修复扫描仪对象问题后会导致问题。@Anthony我猜逻辑错误是他将代码缩减为一个小测试程序的产物。循环中可能还有很多事情要做,将continueVar设置为false的条件可能已被删除。@Daniel很可能是这样,但由于无法确定我是否为了以防万一而指出了它。有关标题,请查看他的代码。问题不在于他陷入了一个无限循环——他想要这样——问题在于扫描仪没有接收新的输入。没错!在程序中,无限循环不是我想要的lol,但在这里,你忽略了我从未将continueVar设置为false的问题。你太棒了,就像我现在所期望的那样工作。谢谢你这么快回答我的问题,程序现在就应该工作了。=)我同意,只要确保将scanner.next()放在循环的catch部分就行了!