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

Cannot use multiple Scanner objects in Java

我最近开始学习Java。当我开始遇到错误时,我正在学习使用 Scanner class 获取用户输入。这是代码:

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()",则代码有效。

问题是什么?

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

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

Scanner userInput2 = new Scanner(System.in);

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

这里有几个问题。

首先,您不想关闭System.in流。程序的其他部分可能正在使用它,您不想干扰它们的正常运行。

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

为此,解决这个问题很简单:

  • 仅使用附加到 System.in
  • 的扫描程序的 一个 实例
  • 删除 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);

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