Java 在try-catch块中捕获InputMidmatchException时无限While循环
我一直让我的代码陷入无限的while循环 这是什么先进,但我不能想出它为我的生活 谁来帮忙 我只是有意地重新创建了特定的错误,而没有实际程序中的所有if语句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) {
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部分就行了!