Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.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中使用多个扫描程序对象_Java_Java.util.scanner - Fatal编程技术网

无法在Java中使用多个扫描程序对象

无法在Java中使用多个扫描程序对象,java,java.util.scanner,Java,Java.util.scanner,我最近开始学习Java。当我开始出错时,我正在学习使用Scanner类获取用户输入。代码如下: Scanner userInput1 = new Scanner(System.in); String name = userInput1.nextLine(); System.out.println("Hi "+ name); userInput1.close(); Scanner userInput2 = new Scanner(S

我最近开始学习Java。当我开始出错时,我正在学习使用Scanner类获取用户输入。代码如下:

Scanner userInput1 = new Scanner(System.in);
        String name = userInput1.nextLine();
        System.out.println("Hi "+ name);
        userInput1.close();

        Scanner userInput2 = new Scanner(System.in);
        int age = userInput2.nextInt();
        System.out.println(age);
当我输入“Deadboy”作为输入时,出现以下错误:

Hi Deadboy
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at com.first.Main.main(Main.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Process finished with exit code 1
我无法输入“年龄”的值。 但是,如果我对“userInput1.close()”行进行注释,代码就会正常工作

有什么问题


如果这个问题以前有人回答过,我很抱歉。我发现了一个类似的问题,但我不确定它的答案是否是我想要的。

这里的问题是,当您关闭Scanner userInput1时,它会关闭创建它的输入源-在这种情况下,它是您从访问System.in获得的InputStream。 所以当你打电话的时候

Scanner userInput2 = new Scanner(System.in);

此时System.in InputStream已经关闭,您无法再使用它。

这里有几个问题

首先,您不想关闭
流中的
系统。程序的其他部分可能正在使用它,您不想干扰它们的正常操作

其次,创建多个扫描仪对象没有任何好处。它只是从一个流中读取输入,并且对该流有多个引用对您的操作没有必要或没有好处

为此,解决方法很简单:

  • 仅使用连接到
    系统的扫描仪的一个实例。在
    中,以及
  • 删除
    close()
    方法调用

实际上,每次您想要从控制台读取内容时,都不需要创建Scanner对象。可以使用相同的扫描仪对象

Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("Hi "+name);

        int age = scanner.nextInt();
        System.out.println("Age :" + age);

有几件事。首先,不需要制作两个扫描仪对象。您可以使用一个扫描仪对象来扫描所有内容,就像您使用它的方式一样。第二,用你现在的方式关闭扫描仪是没有意义的。你为什么要关闭扫描仪?修复这些,然后再次运行代码

为什么要关闭扫描仪并立即创建一个新的扫描仪?您可以使用相同的实例userInput1@Deadboy问:“你什么时候用close?”答:这与你出门时锁门和扔掉钥匙相比;-)严肃:这表明你不再需要这个资源,或者你打算以一种非常不同的方式使用它,例如,在写作后阅读。请注意,关闭扫描仪会有效地关闭它所连接的流,而该流又可能连接到(磁盘)文件、设备或管道等@laune,因此如果我从不使用close(),是否可以?谢谢!但是什么时候使用
close()
呢?当你在做文件I/O的事情时,你通常会使用
close()
扫描器,比如使用扫描器实例读取文件,或者(更广泛地说)你打算关闭进入你程序的数据流。三个主要的流(
System.out
System.in
System.err
)只是流,但关闭它们从来都不是一个好主意。