无法在Java中使用多个Scanner对象

时间:2015-03-14 20:03:01

标签: 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(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()"进行注释,则代码可以正常工作。

有什么问题?

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

4 个答案:

答案 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对象。您可以使用一个扫描仪对象扫描所有内容,就像您使用它一样。第二,按照你的方式关闭扫描仪是没有意义的。你为什么关闭扫描仪?修复这些,然后再次运行代码。