java.util.Scanner抛出NoSuchElementException的第二个实例

时间:2017-04-07 13:48:07

标签: java instance nosuchelementexception

为什么我无法阅读使用第二个扫描仪实例的第二行?我得到一个" java.util.NoSuchElementException:找不到行"。

我知道我应该使用hasNextLine()并避免异常,但我的问题是为什么第二行根本不可用?此外,有多个扫描程序实例的原因是因为实际上,扫描程序是在一个多次调用的方法中实例化的,我不是在寻找解决方案或修复它。

请注意,我没有关闭扫描仪或流。我每次只使用扫描仪读取1行,而我在流中有3行。

这是我简化的程序:

private void scanLines() {
    String input = "Line 1." + System.lineSeparator() 
                 + "Line 2." + System.lineSeparator() 
                 + "Line 3." + System.lineSeparator();

    ByteArrayInputStream bais = new ByteArrayInputStream(input.getBytes());

    Scanner scanner1 = new Scanner(bais);
    System.out.println(scanner1.nextLine());

    Scanner scanner2 = new Scanner(bais);
    System.out.println(scanner2.nextLine());
}

输出是:

Line 1.
Exception in thread "main" java.util.NoSuchElementException: No line found
        at java.util.Scanner.nextLine(Unknown Source)
        at ScannerTest.scanLines(ScannerTest.java:23)
        at ScannerTest.main(ScannerTest.java:6)

1 个答案:

答案 0 :(得分:0)

使用多个扫描程序(在同一个流上)是一种非常糟糕的做法,因为扫描程序会使用它们共享的流。

这是您遇到异常java.util.NoSuchElementException: No line found的原因。

我已经测试了您的代码,并且通过第二次nextLine()调用引发了异常。

在每个Scanner类中保存对同一输入流的引用。

调用scanner1.nextLine()方法时,会在流上读取一堆字节,并且位置会向前移动。

为了清楚起见,我已经仔细检查了Scanner类的源代码。

当调用nextLine()方法时,在后台将流移动到1024位置之前将结果复制到缓冲区

// Internal buffer used to hold input
private CharBuffer buf;

尝试自己调试Java源代码并查看方法readInput()