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

问题描述 投票:0回答:1

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

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

java java.util.scanner nosuchelementexception
1个回答
7
投票

来自

Scanner.close()
的文档:

如果它的底层可读对象也实现了

Closeable
接口那么可读对象的
close
方法将被调用。

所以当你关闭扫描器时,它也会关闭

System.in
,这意味着你以后不能用它制作一个新的扫描器,因为一旦它关闭你就不能重新打开流。

你在第二个例子中只会得到一个

OutOfMemoryError
,因为你试图分配无限数量的扫描仪并防止它们被垃圾收集,而不是因为扫描仪特别重量级。

© www.soinside.com 2019 - 2024. All rights reserved.