【问题标题】:Not waiting for scanner input, throwing ElementNotFoundException不等待扫描仪输入,抛出 ElementNotFoundException
【发布时间】:2019-04-19 18:33:45
【问题描述】:

所以我正在尝试编写一个简单的菜单,其中一些选项会打印到屏幕上,然后我会询问用户他们想要哪个选项。无论他们键入什么,都应该保存并将它们发送到菜单选项之一。相反,它在第 20 行 (String userInput = user.next();) 给了我一个“NoSuchElementException”。我没有任何 .nextInt() 请帮忙。

我已经尝试过一段时间(user.hasNext()) {} 和 if(user.hasNext()){} 并将它们一起尝试。我要么得到异常,要么陷入无限循环。

public static void menu(Pet myPet) {


    System.out.println();
    System.out.print("Welcome, " + myPet.getName());

    while(true) {

        Scanner user = new Scanner(System.in);
        System.out.println(". What would you like to do?");
        System.out.println("Games Feed Walk Status");
**Error**   String userInput = user.next();

        if (userInput.equals("Games")) {

它应该只是等待输入。我已经尝试设置 userInput 并且它似乎可以工作,但是在我的游戏菜单中我有一个类似的设置并且它也在那里中断。

【问题讨论】:

  • 您是否正在关闭System.in 其他任何地方?你能提供一个minimal reproducible example 让我们自己尝试重现这个吗?
  • 另外,不要在循环中创建扫描器,因为它很可能会破坏所有未来从标准输入读取的扫描器(它会缓冲用户输入,使其无法被其他扫描器访问)。在循环之外定义扫描仪来解决这个问题。

标签: java java.util.scanner nosuchelementexception


【解决方案1】:

我没有您的所有源代码,但您似乎在 while 循环中的扫描仪上调用 close()

以下 sn-p 有效:

        while (true) {

        Scanner user = new Scanner(System.in);
        System.out.println(". What would you like to do?");
        System.out.println("Games Feed Walk Status");
        String userInput = user.next();

        System.out.println(userInput);
    }

提示正确:

. What would you like to do?
Games Feed Walk Status
test1
test1
. What would you like to do?
Games Feed Walk Status
test2
test2

但是,在循环内的扫描仪上添加 close() 调用会重新创建您描述的异常。

        while (true) {

            Scanner user = new Scanner(System.in);
            System.out.println(". What would you like to do?");
            System.out.println("Games Feed Walk Status");
            String userInput = user.next();

            System.out.println(userInput);
            user.close(); // The offending line!
        }
    }
Games Feed Walk Status
test1
test1
. What would you like to do?
Games Feed Walk Status
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1371)
    at Test.main(Test.java:11)

关闭扫描器还将刷新底层流并将其释放回操作系统,然后认为它在应用程序生命周期的剩余部分无用。如果您需要重用扫描仪,您应该在完成后关闭它。

【讨论】:

  • 我的代码中没有 .close() 行。我想可能是因为我没有关闭它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2013-02-22
  • 2018-03-18
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多