初学者 - 带扫描仪对象的无限循环

时间:2018-02-20 04:03:19

标签: java loops io java.util.scanner

在下面的代码中,如果在InputMismatchException部分下面输入任何导致try的内容,我会得到一个无限循环

   public static void main(String[] args) {
       Scanner in = new Scanner(System.in);
       double x;
       boolean b = true;
       while (b) {
           try {
               x = in.nextDouble(); //Enter 4a
               b = false;
           } catch (InputMismatchException e) {
               System.out.println("Wrong");
               // in.nextLine();
           }
       }
       in.close();
   }

如果我取消注释in.nextLine();,代码运行正常。我想知道为什么会有无限循环。我不明白为什么会出现无限循环,因为在catch部分执行后,我应该能够在再次执行try部分时输入数据。为什么这不会发生?

4 个答案:

答案 0 :(得分:1)

扫描仪维护位置变量。

// The index into the buffer currently held by the Scanner
private int position;

如果出现异常,则位置值不会更新,并且扫描仪会一直尝试从包含无效令牌的相同位置进行读取。

in.nextLine()

上面的行将位置变量移过错误的令牌,准备好读取缓冲区中的新数据。

答案 1 :(得分:0)

来自Scanner javadoc

  

将输入的下一个标记扫描为double。这个方法会抛出   InputMismatchException如果下一个标记无法转换为   有效的双倍价值。如果翻译成功,则扫描仪   超越匹配的输入。

正如MFisherKDX评论的那样,如果输入是有效的双倍,扫描仪只会 。因此,必须以编程方式跳过令牌。

答案 2 :(得分:0)

所以in.nextLine();所做的就是消耗剩余的新行。在您的情况下,当发生异常时,不会执行此操作,并且您的代码将进入无限循环。

因此,in.nextDouble()in.nextLine()要求使用剩余的行。

答案 3 :(得分:0)

无限循环的原因是指针(可以说是位置)扫描器保持访问元素,并且在访问元素之后,指针被提前。

但是当任何扫描程序方法(即next()nextDouble())抛出异常时,您仍然处于扫描程序尝试访问该元素的同一位置/指针处,并且抛出了异常。

由于您已经在catch语句中捕获了异常,但指针仍然存在(在同一位置)将持续抛出异常,为避免这种情况,您必须使用.nextLine()推进指针。这会将指针移动到下一行以接受下一个输入。