【问题标题】:Endless while loop problem with try/catchtry/catch 的无尽循环问题
【发布时间】:2011-01-13 02:51:58
【问题描述】:

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

【问题讨论】:

  • 在这种情况下input 是什么?
  • 输入什么样的对象?扫描仪?
  • 捕捉Exception 很糟糕,不要这样做。它可能是NullPointerException,但你永远不会知道。它也会产生你所描述的结果。

标签: java exception


【解决方案1】:

当您输入一个不是数字的令牌时,调用 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() 的调用也可能会引发异常。具体来说,如果 Scanner 已关闭(这不应该在您的代码中发生),它可能会抛出 IllegalStateException ;如果 Scanner 已到达输入的末尾(如果您从键盘读取,则不会发生 NoSuchElementException,因为我假设你是)。但为了安全起见,您应该捕获这些错误并跳出循环,或者不捕获它们,而是将它们声明为由您的方法抛出。

【讨论】:

  • 非常感谢。一个后续问,您所说的 Scanner 被关闭是什么意思?
  • @Adam:类 Scanner 有一个 close() 方法,可用于关闭 Scanner 以便您无法再从中读取。这种方法很方便,因为可以在许多不同的输入源(文件、管道等)上打开 Scanner。当它被调用时,它也会自动关闭它的输入源。但是,如果您要调用 input.close(),然后调用 input.nextInt() 或 input.hasNext(),则会抛出 IllegalStateException。只有在调用 input.close() 时才会发生这种情况。它不会仅仅因为到达输入的结尾而发生。
【解决方案2】:

如文档中所述:

当扫描器抛出 InputMismatchException 时,扫描器不会传递导致异常的令牌,以便可以通过其他方法检索或跳过它。

所以相同的(不是整数)令牌将继续抛出异常。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2021-12-18
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多