使用try / catch时无休止的循环问题

我有一个while循环,它应该捕获一个非int输入并要求用户重新输入一个int。 然而,它只是无休止地循环错误消息。 有没有人知道为什么第二次不允许扫描仪输入?

while(!enteredInt) { try { locus = input.nextInt(); enteredInt = true; } catch (Exception e) { //user didn't type an integer System.out.println("You didn't enter a valid number, re-enter point where you will build your city"); } } 

当您输入不是数字的令牌时,调用nextInt不会将扫描程序移动到令牌之外。 结果,它只是一遍又一遍地阅读相同的标记。

这是nextInt的文档: http : //download.oracle.com/javase/6/docs/api/java/util/Scanner.html#nextInt%28%29 (虽然相关行为实际上在版本中描述了一个参数,这里: http : //download.oracle.com/javase/6/docs/api/java/util/Scanner.html#nextInt%28int%29 )

所以,为了给你一个简单的例子,让我们假设输入字符串是"1 2 Foo" 。 我将添加一个X来显示扫描仪当前所处的位置。 它开始"X1 2 Foo" 。 然后第一次调用input.nextInt() 。 它返回1,现在我们处于"1 X2 Foo" 。 然后第二次调用input.nextInt() 。 它返回2,现在我们处于"1 2 XFoo" 。 然后第三次调用input.nextInt() 。 它不会返回,而是抛出一个InputMismatchException,它也不会使Scanner前进。 所以我们仍然在"1 2 XFoo" 。 因此,当我们称它为第四次或第五次时,同样的事情发生了。

要解决此问题, input.next()调用将使用下一个标记,无论它是什么。 在此调用之后,在我们的示例中,我们将处于"1 2 FooX"

但请注意,对input.next()的调用仍然可以抛出exception。 具体来说,如果扫描程序关闭(在代码中不应该发生),它可以抛出IllegalStateException;如果扫描程序已经到达输入结束,则可以抛出NoSuchElementException(如果你从键盘读入,这将不会发生,因为我假设你是)。 但为了安全起见,您应该捕获这些错误并突破循环或者不捕获它们,而是将它们声明为您的方法抛出。

如文档中所述:

当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致exception的标记,因此可以通过其他方法检索或跳过它。

因此,相同(非整数)令牌将继续抛出exception。

您可以使用next()方法在catch中检索该标记。