什么场景会使用 nextLine() 创建 nosuchelementexception?

What scenario would create an nosuchelementexception with nextLine()?

nextLine() 的文档说它可以抛出 nosuchelementexception。但是当使用 nextLine() 获取扫描仪的输入时,如以下代码所示,不会抛出 nosuchelementexception,唯一发生的事情是按两次“Enter”,程序就结束了。我将相同的代码提交给在线系统进行评估,系统也说该代码抛出 nosuchelementexception

什么样的输入会产生 nosuchelementexception

String input = "";
Scanner sc = new Scanner(System.in);

input += sc.nextLine() + " ";
input += sc.nextLine() + " ";

System.out.println(input);

我觉得读文件的时候可以这样:

我创建了一个新的 txt-file,其中没有任何内容 (test.txt) 和 运行 以下代码:

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("test.txt");
        Scanner sc = new Scanner(file);
        String str = sc.nextLine();
    }
}

结果:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
    at Test.main(Test.java:9)

编辑

它也可以与 System.in 一起出现,因为当关闭一台扫描仪时它似乎也关闭了 System.in。

考虑以下代码:

import java.util.Scanner;
import java.io.FileNotFoundException;

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner sc = new Scanner(System.in);
        Scanner sc2 = new Scanner(System.in);
        sc.nextLine();
        sc.close();
        sc2.nextLine();
    }
}

这将引发以下异常:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
    at Test.main(Test.java:10)

发生这种情况是因为 sc(可以访问 System.in)已关闭。这导致 System.in 不再可访问,因此 sc2 无法正常工作并抛出异常。

这是一个标准输入(即 System.in)从另一个应用程序通过管道传输的示例:

echo 'one line only' | java Read

或从文件读取:

java Read <file_with_one_line.txt

或使用交互式用户输入:

java Read
I am entering one line
Ctrl+D

这些示例假定您已将发布的代码(包装在 class Read 中)编译到同一目录中的 Read.class

import java.util.Scanner;

class Read {
    public static void main(String[] args) {
        String input = "";
        Scanner sc = new Scanner(System.in);

        input += sc.nextLine() + " ";
        input += sc.nextLine() + " ";

        System.out.println(input);
    }
}
javac read.java