4

我正在尝试编写战舰游戏,但在提示用户输入他们的猜测坐标时遇到了这个错误:

Exception in thread "main" java.util.NoSuchElementException


    at java.util.Scanner.throwFor(Unknown Source)
        at java.util.Scanner.next(Unknown Source)
        at java.util.Scanner.nextInt(Unknown Source)
        at java.util.Scanner.nextInt(Unknown Source)
        at game.User.takeTurn(User.java:121)
        at game.Game.main(Game.java:61)

这是发生错误的方法 User.takeTurn() :

    static void takeTurn() {
           System.out.println("Yout turn!");
           System.out.println("Enter your x guess:");
           Scanner scanInput = new Scanner(System.in);
           int x;
           x = scanInput.nextInt();
           System.out.println("You entered "+ x + ", Now enter your y     coord:");
           int y;
           y = scanInput.nextInt();
           System.out.println("You entered + " + y);
           if(Board.aiBoard[x][y] == 2) {
               System.out.println("Hit! You got a hit at: " + x + "," + y);
               Board.enemyBoardDisplay[x][y] = 'h';
               Board.aiBoard[x][y] = 3;
           }
           else {
            System.out.println("Miss!");
            Board.enemyBoardDisplay[x][y] = 'x';
            Board.aiBoard[x][y] = 1;
          }

           scanInput.close();
      }

我不确定这是否重要,但我也在课堂上使用了另一台扫描仪。如果您需要更多代码来帮助,请告诉我。谢谢!

编辑1:好的,即使我做了 scanInput.hasNextInt() 它也不起作用。我还输入了一个给出 xa 值的 else 语句,但现在 x 总是具有 else 语句给出的值。它甚至要求输入它只是默认为该值。但我不希望它进入我希望用户选择的默认值。

编辑 2:这是我在主存根中调用代码的地方

while (gameOn == true) {
            if (turn == 0) {
                User.takeTurn();
                Board.sunkCheck();
                if (gameOn == false)
                    break;
            }

            else if (turn == 1) {
                Computer.takeTurn();
                Board.sunkCheck();
                if (gameOn == false)
                    break;
            }

这是我之前在同一个班级中使用扫描仪的地方,因为我现在尝试使用扫描仪:

System.out
                .println("\n Please enter the first x value for your ship  (Note, this will be the first point, from this point the \n"
                        + " ship can either go vertically downward or horizontally to the right so please choose the topmost point or leftmost \n"
                        + "point to do this. Also, the board is 10x10 but due to java array indexing the coordinates go x 0-9 y 0-9: ");
        try {
        Scanner coord = new Scanner(System.in);
        userX = coord.nextInt();
        System.out.println("You entered: " + userX);
        System.out.println("Now enter the y coordinate for this point: ");
        userY = coord.nextInt();
        System.out.println("You entered: " + userY);
        System.out
                .println("Please choose the direction of your ship. Enter v for verticle or h for horizontal(case sensitive): ");
        dir = (char) System.in.read();
        coord.close();
        }
        catch(InputMismatchException e) {
            System.out.println("Good job doof, since you tried to troll we did all the values for you!");
            userX = 3;
            userY = 3;
            dir = 'v';
        }
4

2 回答 2

3

您可能想nextScanner使用scanInput.hasNextInt().


更新:

如果您使用上述方法,然后在不关闭 的情况下Scanner coord = new Scanner(System.in);调用该函数,那么您将遇到问题。Scanner scanInput = new Scanner(System.in);coord Scanner

扫描器将继续使用流 - 这可能(将)导致意想不到的副作用。

您可能希望在使用另一个之前关闭第一个(此处获取更多参考)。


更新:

当您关闭时,coord.close()您正在关闭System.in并且当您尝试从中重新读取时,它会抛出异常。

而不是每次需要输入时都重新打开流,您可以创建Scanner一次并重新使用它。

于 2015-01-31T07:00:48.343 回答
1

当您尝试从扫描仪读取输入并且输入不存在时,会发生NoSuchElementException 。

因此,在接受输入之前,您应该检查扫描仪是否有一些输入供您使用,例如:

if (scanInput.hasNextInt()) {
    x = scanInput.nextInt();
}
于 2015-01-31T07:00:12.480 回答