Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.Scanner第二个实例引发NoTouchElementException_Java_Instance_Nosuchelementexception - Fatal编程技术网

java.util.Scanner第二个实例引发NoTouchElementException

java.util.Scanner第二个实例引发NoTouchElementException,java,instance,nosuchelementexception,Java,Instance,Nosuchelementexception,为什么我无法使用第二个扫描仪实例读取第二行?我得到一个“java.util.NoSuchElementException:找不到行” 我知道我应该使用hasNextLine()并避免异常,但我的问题是为什么第二行根本不可用?另外,存在多个scanner实例的原因是,实际上,scanner是在一个被多次调用的方法中实例化的,而我并不是在寻找解决方案或修复方案 请注意,我没有关闭扫描仪或流。我使用扫描器只读取了每一行,而流中有3行 以下是我的简化程序: private void scanLines(

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

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

请注意,我没有关闭扫描仪或流。我使用扫描器只读取了每一行,而流中有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:找不到您的代码行

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

每个
扫描器
类都保存了对同一输入流的引用

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

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

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

// Internal buffer used to hold input
private CharBuffer buf;
尝试自己调试Java源代码并查看方法。

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

这就是异常的原因
java.util.NoSuchElementException:找不到您的代码行

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

每个
扫描器
类都保存了对同一输入流的引用

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

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

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

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

尝试自己调试Java源代码并查看方法。

永远不要在同一个流上使用两个扫描仪,为什么要在读取字符串行时使用ByteArrayInputStream?!用同样的scanner@GhostCat我想要一个inputstream传递给扫描器的构造函数,最简单的方法是创建一个字符串并将其转换为ByteArrayInputStream。我的理论是:扫描器通常从文件或其他资源中读取数据,这些文件或资源需要获得从操作系统读取的权限。获得这样的许可通常需要一些时间,而且可能非常昂贵。因此,我们不希望为每个特定角色请求此权限。相反,我们只想获得一次,当我们让它读更多的时候,不是小的,也不是大的,因为阅读也需要一些时间,这在其他地方可能需要。在这种情况下,缓冲区/缓存的大小似乎超过了字符串中字节的大小,因此所有的缓冲区/缓存都将被读取,而下一个扫描程序将不读取任何字节。永远不要在同一个流上使用两个扫描程序,为什么要在读取字符串行时使用ByteArrayInputStream?!用同样的scanner@GhostCat我想要一个inputstream传递给扫描器的构造函数,最简单的方法是创建一个字符串并将其转换为ByteArrayInputStream。我的理论是:扫描器通常从文件或其他资源中读取数据,这些文件或资源需要获得从操作系统读取的权限。获得这样的许可通常需要一些时间,而且可能非常昂贵。因此,我们不希望为每个特定角色请求此权限。相反,我们只想获得一次,当我们让它读更多的时候,不是小的,也不是大的,因为阅读也需要一些时间,这在其他地方可能需要。在这种情况下,缓冲区/缓存的大小似乎超过了字符串中字节的大小,所以所有字节都将被读取,而不会留给下一个扫描仪。谢谢!有关于此的文档/javadocs吗?是的,流的位置向前移动,但它应该向前移动1行,而不是消耗整个流。您忘记了有一个底层缓冲区。。。也许我错了……我已经仔细检查了read()的位置,将其向前移动1024字节,然后将结果存储到缓冲区中。谢谢!有关于此的文档/javadocs吗?是的,流的位置向前移动,但它应该向前移动1行,而不是消耗整个流。您忘记了有一个底层缓冲区。。。也许我错了……我已经仔细检查了read()的位置,将其向前移动1024字节,然后将结果存储到缓冲区中。