为什么这段代码变成了无限循环?

Ser*_*ize 2 java infinite-loop while-loop

我写了这个简单的代码来获取一个double并且只是一直询问,直到给出一个,但是当你给一个字符串它只是变成一个无限循环而我无法弄清楚为什么.它出现这种情况的原因是什么?

Scanner scanner = new Scanner(System.in);   
double x = 0.0d;

while (true) {
    try {
        System.out.println("Gimme a double:");

        x = scanner.nextDouble();
        break;
    } catch (InputMismatchException e) {}           
}

System.out.println(x);
Run Code Online (Sandbox Code Playgroud)

Rei*_*eus 7

如果double最初输入无效值,它将变为无限循环.然后,Control进入异常块.因为Scanner#nextDouble不使用换行符,所以这些值会重复传递给语句

x = scanner.nextDouble();
Run Code Online (Sandbox Code Playgroud)

这不阻止已经收到输入.这导致无限循环.

Scanner#nextLine应该使用而不是使用空的异常块来使用换行符.

} catch (InputMismatchException e) {
    System.out.println("Error found: " + scanner.nextLine() + " continuing...");
}
Run Code Online (Sandbox Code Playgroud)

这样该Scanner#nextDouble行将IO在下一次迭代中阻塞.