【发布时间】:2018-12-06 06:58:27
【问题描述】:
这是引发异常的代码的简化版本。
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);
}
线程“主”java.util.NoSuchElementException 中的异常:没有行 在 java.util.Scanner.nextLine(Scanner.java:1540) 中找到 temp.Temp.getString(Temp.java:13)
我两次调用getString 方法,第二次调用时中断:
s = sc.nextLine();
现在,我知道删除 sc.close() 行可以解决问题(也可能使 sc 成为静态变量)。我需要掌握的是为什么会这样。
我阅读了scanner 类的规范,但无法推断。我还阅读了有关此异常的几篇文章,包括 this 一篇文章,其中说关闭扫描仪也会关闭底层流。但是我正在创建一个新的扫描仪并在每次方法调用时重新打开流,不是吗?
【问题讨论】:
-
您没有创建新的流。您总是使用相同的流:System.in。当它关闭时,它就关闭了。
-
@JBNizet,是的,注意到了,只是将其更正为“重新开放”。不过,这个问题仍然存在。或者你的意思是,一旦关闭,无论如何都无法重新打开?
-
当您关闭扫描仪时,它会关闭正在使用的流,即 System.in
-
不,你没有“重新打开”任何东西。无法重新打开流,并且任何地方都没有“重新打开”。您正在使用单个流,当它关闭时,它就关闭了。永远。
标签: java java.util.scanner nosuchelementexception system.in