我最近开始学习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
我无法输入" age"的值。 但是,如果我对该行" userInput1.close()"进行注释,则代码可以正常工作。
有什么问题?
如果之前已经回答过这个问题,我很抱歉。我发现了一个类似的问题,但我不确定它的答案是否是我正在寻找的答案。
答案 0 :(得分:4)
这里有几个问题。
首先,不要关闭System.in
流。程序的其他部分可能正在使用它,并且您不想干扰它们的正常操作。
其次,创建多个Scanner对象没有任何好处。它只是简单地从流中读取输入,并且对该流的多个引用对您的操作不是必需的或有益的。
为此,对此的修复将是直截了当的:
System.in
相关联的扫描仪的一个实例,close()
方法调用。答案 1 :(得分:1)
这里的问题是,当您关闭Scanner userInput1时,它会关闭创建它的输入源 - 在这种情况下,它是您从访问System.in获得的InputStream。 所以当你打电话时
Scanner userInput2 = new Scanner(System.in);
此时System.in InputStream已经关闭,您无法再使用它了。
答案 2 :(得分:1)
每次要从控制台读取内容时,实际上不需要创建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);
答案 3 :(得分:1)
有几件事。首先,您不需要制作两个Scanner对象。您可以使用一个扫描仪对象扫描所有内容,就像您使用它一样。第二,按照你的方式关闭扫描仪是没有意义的。你为什么关闭扫描仪?修复这些,然后再次运行代码。