无法在Java中使用多个扫描程序对象
我最近开始学习Java。当我开始出错时,我正在学习使用Scanner类获取用户输入。代码如下:无法在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
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
)只是流,但关闭它们从来都不是一个好主意。