在方法中重新打开扫描仪时出现 NoSuchElementException

NoSuchElementException on reopening the scanner within a method

这是抛出异常的代码的简化版本。

static String s1;
static String s2;

static void getString(String s) {
    Scanner sc = new Scanner(System.in);
    s = sc.nextLine();
    sc.close();
}

public static void main(String[] args) {
    getString(s1);
    getString(s2);
}

Exception in thread "main" java.util.NoSuchElementException: No line found at java.util.Scanner.nextLine(Scanner.java:1540) at temp.Temp.getString(Temp.java:13)

我调用了 getString 方法两次,第二次调用时它中断了:

s = sc.nextLine();

现在,我知道删除 sc.close() 行可以解决问题(也可能使 sc 成为静态变量)。我需要了解的是为什么会这样。

我阅读了 scanner class 的规范,但无法推断。我还阅读了有关此异常的几篇文章,包括 this 一篇,其中说关闭扫描器也会关闭底层流。但是我正在创建一个新的扫描器并在每次方法调用时重新打开流,不是吗?

没有"reopening a stream"这样的东西。您唯一可以做的就是创建一个新的流,其中包含一个新的 Scanner,并可选择将其放置在同一个变量中。

关闭 sc 后,您也会关闭基础 System.in 流。在它上面创建一个新的 Scanner 不能 "reopen" 它,并且由于流已关闭,你会得到这个异常。

长话短说 - 虽然在使用完资源后关闭资源绝对是一个好习惯,但您不应该关闭 System.in(或任何基于它的扫描器)。

您不能 "re-open" System.in、System.out 或 System.err 所解释的 here

作为此问题的另一种解决方案,您可以使用解释为 here

的 CloseShieldInputStream