gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:44:04 32 4
gpt4 key购买 nike

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

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

最佳答案

来自the documentation for Scanner.close() :

if its underlying readable also implements the Closeable interface then the readable's close method will be invoked.

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

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

关于java - 为什么我不能在使用scanner.close()后创建另一个扫描仪对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58244954/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com