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

时间:2011-01-13 02:51:58

标签: java exception

我有一个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");
      }
  }

2 个答案:

答案 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中检索该标记。