我有一个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");
}
}
答案 0 :(得分:9)
当您输入不是数字的令牌时,调用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()
的调用仍然可以抛出异常。具体来说,如果扫描程序关闭(在代码中不应该发生),它可能会抛出IllegalStateException;如果扫描程序已经到达输入结束,则会抛出NoSuchElementException(如果您从键盘读取,则不会发生这种情况,因为我假设你是)。但为了安全起见,您应该捕获这些错误并突破循环或不捕获它们,而是将它们声明为您的方法抛出。
答案 1 :(得分:2)
如文件中所述:
当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致异常的标记,因此可以通过其他方法检索或跳过它。
因此相同(非整数)令牌将继续抛出异常。
您可以使用next()方法在catch中检索该标记。