为什么在使用 scanner.close() 后不能创建另一个扫描器对象?



使用 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
}
}
}

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

来自Scanner.close()的文档:

如果其基础可读量也实现了Closeable接口,则将调用可读量的close方法。

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

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

最新更新