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

标签 java java.util.scanner nosuchelementexception system.in

这是引发异常的代码的简化版本。

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/

相关文章:

java - 字符串是否有等效的 hasNext() 方法?

java - 使用 Scanner 时出现 NoSuchElement 异常

java - 我收到 NoSuchElement 异常错误

java - 如何使用Java API获取云服务(托管服务)诊断数据?

java - Ubuntu 上的 play-1.2.3

java - 如何诊断和修复 hibernate/jpa 显然没有正确发送 unicode 字符作为 SQL 2008 上查询的参数

java - 文件字数统计

java - java程序中通过互联网进行更新检查

java - 在执行完 Scanner 对象的 close() 方法后,如何再次创建它?

java - 查找二维数组中的节点邻居