在下面的代码中,如果在InputMismatchException
部分下面输入任何导致try
的内容,我会得到一个无限循环
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
double x;
boolean b = true;
while (b) {
try {
x = in.nextDouble(); //Enter 4a
b = false;
} catch (InputMismatchException e) {
System.out.println("Wrong");
// in.nextLine();
}
}
in.close();
}
如果我取消注释in.nextLine();
,代码运行正常。我想知道为什么会有无限循环。我不明白为什么会出现无限循环,因为在catch
部分执行后,我应该能够在再次执行try
部分时输入数据。为什么这不会发生?
答案 0 :(得分:1)
扫描仪维护位置变量。
// The index into the buffer currently held by the Scanner
private int position;
如果出现异常,则位置值不会更新,并且扫描仪会一直尝试从包含无效令牌的相同位置进行读取。
in.nextLine()
上面的行将位置变量移过错误的令牌,准备好读取缓冲区中的新数据。
答案 1 :(得分:0)
将输入的下一个标记扫描为double。这个方法会抛出 InputMismatchException如果下一个标记无法转换为 有效的双倍价值。如果翻译成功,则扫描仪 超越匹配的输入。
正如MFisherKDX评论的那样,如果输入是有效的双倍,扫描仪只会 。因此,必须以编程方式跳过令牌。
答案 2 :(得分:0)
所以in.nextLine();
所做的就是消耗剩余的新行。在您的情况下,当发生异常时,不会执行此操作,并且您的代码将进入无限循环。
因此,in.nextDouble()
或in.nextLine()
要求使用剩余的行。
答案 3 :(得分:0)
无限循环的原因是指针(可以说是位置)扫描器保持访问元素,并且在访问元素之后,指针被提前。
但是当任何扫描程序方法(即next()
,nextDouble()
)抛出异常时,您仍然处于扫描程序尝试访问该元素的同一位置/指针处,并且抛出了异常。
由于您已经在catch
语句中捕获了异常,但指针仍然存在(在同一位置)将持续抛出异常,为避免这种情况,您必须使用.nextLine()
推进指针。这会将指针移动到下一行以接受下一个输入。