为什么我无法读取使用第二个 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/