【问题标题】:Why cant I just create another scanner object after using scanner.close()?为什么我不能在使用scanner.close() 后创建另一个scanner 对象?
【发布时间】:2019-10-05 02:47:34
【问题描述】:

使用scanner.close() 方法后,我无法打开另一个扫描仪。我在谷歌上搜索了我的问题,只找到提供解决方案的人。我只是想首先了解为什么这是一个问题。谁能解释一下为什么?

import java.util.Scanner;

public class Main {

    public static Scanner scan = new Scanner(System.in);

    public static void main(String[] args) {
        scan.close();

        Scanner scan = new Scanner(System.in);

        System.out.println(scan.next());  //NoSuchElementException
    }

}

我知道同时打开多个扫描仪会导致 outOfMemoryError,所以我想为什么不将它作为一个可以从中调用方法的单例实用程序类呢?此类将在每次使用时打开和关闭扫描仪,因此流不需要保持打开状态。

public class Main {

    public static void main(String[] args) {
        LinkedList<Scanner> list = new LinkedList<>();
        while(true) {
            list.add(new Scanner(System.in)); //OutOfMemoryError
        }
    }
}

这又回到了我的问题的根源,如果我们都能理解扫描仪类为什么会这样工作,也许我们可以想出一个解决方案?

【问题讨论】:

  • 可以,但是您关闭了System.in,因此您无法从中读取任何内容。真正的问题是为什么要关闭它?如果您需要另一个,为什么不继续使用同一个?
  • 我只是为了探索。我已经知道如何使用同一个。我只是在进一步研究 Scanner 类及其工作原理,以及为什么在 System.in 关闭后我无法重新打开它。

标签: java java.util.scanner nosuchelementexception


【解决方案1】:

来自the documentation for Scanner.close()

如果它的底层可读也实现了Closeable接口,那么可读的close方法将被调用。

因此,当您关闭扫描器时,它也会关闭System.in,这意味着您以后无法从中创建新的扫描器,因为一旦关闭,您将无法重新打开流。

而您在第二个示例中只得到一个OutOfMemoryError,因为您试图分配无限数量的扫描器并防止它们被垃圾收集,而不是因为扫描器特别重。

【讨论】:

  • 我添加了 OutOfMemoryError 的示例,以表明通过能够在需要时打开和关闭扫描仪而不是在程序完成执行之前保持打开状态可以提高效率。所以你的意思是它不是问题的scanner.close()方法,我得到一个NoSuchElementException,因为一旦System.In关闭,我就无法重新打开另一个System.in流。
  • 这毫无意义。我是说问题出在scanner.close() 方法上。
  • " 它也正在关闭 System.in,这意味着您以后不能从中创建新的扫描仪,因为一旦流关闭,您就无法重新打开它。"为什么我们不能在关闭后打开一个新流?
  • 感谢您在@Joseph Sible 的指导方面所做的努力。你的回答给了我一个新问题,让我开始寻找更多答案,我找到了另一个来源。 stackoverflow.com/questions/27286690/…
  • @PanderIT 您无法重新打开已关闭的流,因为它没有 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 2011-08-19
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多