为什么我无法阅读使用第二个扫描仪实例的第二行?我得到一个" 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)
答案 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()
。