【问题标题】:NoSuchElementException on reopening the scanner within a method在方法中重新打开扫描仪时出现 NoSuchElementException
【发布时间】: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


【解决方案1】:

没有“重新打开流”之类的东西。您唯一能做的就是创建一个带有新 Scanner 的新流,并可选择将其放在同一个变量中。

关闭sc 后,您也会关闭底层System.in 流。在它上面创建一个新的Scanner 不能“重新打开”它,并且由于流被关闭,你会得到这个异常。

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

【讨论】:

    【解决方案2】:

    您不能按照here 的说明“重新打开” System.in、System.out 或 System.err

    作为另一种解决方案,您可以使用 CloseShieldInputStream 解释here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-06
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多