这是引发异常的代码的简化版本。
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
类的规范,但无法推断。我还阅读了有关此异常的几篇文章,包括 this其中之一表示关闭扫描仪也会关闭底层流。但我正在创建一个新的扫描仪并在每次方法调用时重新打开流,不是吗?
最佳答案
不存在“重新打开流”这样的事情。您唯一能做的就是使用新的 Scanner
创建一个新流,并可以选择将其放置在同一个变量中。
关闭 sc
后,您还将关闭底层的 System.in
流。在其之上创建一个新的 Scanner
无法“重新打开”它,并且由于流已关闭,因此您会收到此异常。
长话短说 - 虽然在使用完资源后关闭资源绝对是一个好习惯,但您不应该关闭 System.in
(或任何基于它的扫描器) .
关于java - 在方法中重新打开扫描仪时出现 NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53646089/