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

标签 java instance nosuchelementexception

为什么我无法读取使用第二个 Scanner 实例的第二行?我收到“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)

最佳答案

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

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

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

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

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

需要明确的是,我已经仔细检查了 Scanner 类的源代码的调试。

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

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

尝试自己调试Java源码,看看方法readInput() .

关于java.util.Scanner 第二个实例抛出 NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43279825/

相关文章:

java - 安卓工作室 : How to programmatically change an adjacent TextView on the same tablerow?

java - 在 Spring Data JPA 和 Spring Boot 应用程序中启用全局 Hibernate 过滤器

ruby 。如何知道定义了哪个类的实例方法?

java - 为什么我收到 NoSuchElementException?

java - While循环NoSuchElementException整数输入java

java - 自定义编写的 Set 迭代器在 for-each 循环中抛出异常

java - 如何在 xsd 中添加空白验证

azure - 如何在 jenkins 中创建作业来启动和停止 Azure VM

c++ - 如何使用同一个类的成员函数删除当前类实例

java - 错误: Comparator is abstract; cannot be instantiated