Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我不能在使用scanner.close()后创建另一个scanner对象?_Java_Java.util.scanner_Nosuchelementexception - Fatal编程技术网

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

Java 为什么我不能在使用scanner.close()后创建另一个scanner对象?,java,java.util.scanner,nosuchelementexception,Java,Java.util.scanner,Nosuchelementexception,使用scanner.close()方法后,我无法打开其他扫描仪。我在谷歌上搜索了我的问题,只发现有人提出了解决办法。我只是想了解为什么这首先是个问题。有人能解释为什么吗 import java.util.Scanner; public class Main { public static Scanner scan = new Scanner(System.in); public static void main(String[] args) { scan.c

使用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
        }
    }
}
公共类主{
公共静态void main(字符串[]args){
LinkedList=新建LinkedList();
while(true){
list.add(新扫描仪(System.in));//OutOfMemoryError
}
}
}
这又回到了我的问题的根源,如果我们都能理解scanner类为何以这种方式工作,也许我们可以想出一个解决方案?

来自:

如果其底层readable也实现了该接口,则将调用readable的
close
方法

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


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

我添加了OutOfMemoryError的示例,以表明如果能够在需要时打开和关闭扫描仪,而不是在程序完成执行之前一直打开扫描仪,效率会更高。所以你的意思是,问题不在于scanner.close()方法,我得到了一个NoTouchElementException,因为一旦System.In关闭,我就无法重新打开另一个System.In stream。这毫无意义。我说的是scanner.close()方法才是问题所在。“它还关闭了System.in,这意味着你以后不能用它制作新的扫描仪,因为一旦流关闭,你就不能重新打开它。”为什么我们不能在流关闭后打开一个新的流呢?我感谢你在指导@Joseph Sible方面所做的努力。你的回答给了我一个新的问题,让我开始寻找更多的答案,我找到了另一个来源@PanderIT您无法重新打开关闭的流,因为它没有API。您可以,但您关闭了
System.in
,因此无法从中读取任何内容。真正的问题是为什么要关闭它?如果你需要另一个,为什么不继续使用同一个呢?我只是想探索一下。我已经知道如何使用相同的。我只是想进一步了解Scanner类及其工作原理,以及为什么关闭后无法重新打开System.in。