如何解决Java扫描仪中的NoSuchElementException错误?[复制]

how to solve NoSuchElementException Error in Scanner of Java? [duplicate]

提问人:roshannepal_x 提问时间:5/12/2022 更新时间:5/12/2022 访问量:46

问:

我正在制作一个简单的主机游戏,允许玩家进入 x,-x,y,-y方向,根据从键盘收集的输入分别为a,d,w和s, 但是扫描仪正在抛出,我也尝试收集数据,但我得到了类似的异常。 注意:但是扫描仪只能工作一次,即第一次。StringNoSuchElementExceptionnextInt()

我的代码

   private static void gamePlay(boolean isPlaying) {

    while (isPlaying) {

        System.out.println("Choose a, d , s or w for movement:");
        Scanner sc = new Scanner(System.in);
        String choice = sc.next();
        sc.close();
        // code for movement of player according to a or s or d or w
        switch (choice) {
            case "a":
                // Some code here
                // move -x
                break;

            case "d":
                // Some code here
                // move +x

                break;

            case "w":
                // Some code here
                // move +y

                break;

            case "s":
                // Some code here
                // move -y

                break;
            case "q":
                //quit 
                isPlaying = false;
                break;

            default:
                break;

        }

    }

}

**输出**

    Choose a, d , s or w for movement:
    a
    Choose a, d , s or w for movement:
    Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1478)
    at App.gamePlay(App.java:37)
    at App.main(App.java:17)
Java 异常 java.util.scanner nosuchelementexception

评论

2赞 maloomeister 5/12/2022
TL;DR:当您 时,它还会关闭底层流(在本例中)。解决方案:不要关闭包装,使其成为类级变量,并在需要时重用它。close()ScannerSystem.inScannerSystem.in
1赞 Helix112 5/12/2022
只需将 sc.close() 移出 while 循环,并最终更改 sc varibale 的范围,因此它也被声明为 while 循环之外
0赞 roshannepal_x 5/12/2022
我应该在每个循环中实例化对象吗?Scanner
0赞 Helix112 5/12/2022
@roshannepal_x ,在播放方法中,在 while 循环之前只能实例化扫描程序一次
0赞 roshannepal_x 5/12/2022
我应该在我的帖子中上传我更正后的代码以帮助其他人吗?

答:

0赞 rlowell 5/12/2022 #1
private static void gamePlay(boolean isPlaying) {

    while (isPlaying) {

        System.out.println("Choose a, d , s or w for movement:");
        Scanner sc = new Scanner(System.in);
        String choice = sc.next();
        // code for movement of player according to a or s or d or w
        switch (choice) {
            case "a":
                // Some code here
                // move -x
                break;

            case "d":
                // Some code here
                // move +x

                break;

            case "w":
                // Some code here
                // move +y

                break;

            case "s":
                // Some code here
                // move -y

                break;
            case "q":
                //quit
                sc.close();
                isPlaying = false;
                break;

            default:
                break;
        }

    }
}

评论

0赞 Community 5/13/2022
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。