在方法中重新打开扫描仪时出现 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
这是抛出异常的代码的简化版本。
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