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

Pan*_*rIT 0 java java.util.scanner nosuchelementexception

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

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
    }

}
Run Code Online (Sandbox Code Playgroud)

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

public class Main {

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

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

Jos*_*ica 5

从文档中Scanner.close():

如果其底层可读项也实现了该Closeable接口,则将close调用该可读项的方法。

因此,当您关闭扫描仪时,它也会同时关闭System.in,这意味着您以后不能再使用它来制作新的扫描仪,因为一旦关闭流就无法重新打开它。

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