我一直在无限循环中捕获我的代码。
没有什么可以提升的,但我无法理解我的生活!
有人请帮忙
我完全没有创建特定的错误,而没有我在实际程序中的所有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?!
答案 0 :(得分:5)
没有跳过扫描仪,它只是从输入的开始处开始。来自JavaDoc:
如果翻译成功,扫描仪将超过匹配的输入。
这意味着如果转换不成功,扫描仪将无法前进。因此,您只需使用next()
手动跳过错误的输入。
编辑:在尝试阅读输入之前,您可能需要检查hasNextInt()
。
答案 1 :(得分:0)
我认为你想在异常处理程序中将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