java close scanner&超出界限

时间:2017-02-28 12:30:01

标签: java

我的代码中出现了两种不同的错误。

一个是当某人输入的数字高于8或低于0时。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 22
    at boter_kaas_en_eiren.Board.placeAttempt(Board.java:37)
    at boter_kaas_en_eiren.Game.play(Game.java:28)
    at boter_kaas_en_eiren.MainClass.main(MainClass.java:12)

另一个错误是当玩家获胜并且我想要关闭扫描仪以便任何人都不能再玩了。

Exception in thread "main" java.lang.IllegalStateException: Scanner closed
    at java.util.Scanner.ensureOpen(Unknown Source)
    at java.util.Scanner.findWithinHorizon(Unknown Source)
    at java.util.Scanner.nextLine(Unknown Source)
    at boter_kaas_en_eiren.Game.play(Game.java:23)
    at boter_kaas_en_eiren.MainClass.main(MainClass.java:12)

如果有人可以帮助我,我会批评它。

游戏类

package boter_kaas_en_eiren;

import java.util.Scanner;

public class Game {

    private Board board;
    private boolean gameFinished;

    public Game() {
        board = new Board();
        gameFinished = false;
    }

    public void play() {
        Scanner scan = new Scanner(System.in);
        int x = 0;
        String nextSymbol = "x";

        board.ShowBoard();

        while (gameFinished == false) {
            String input = scan.nextLine();
            int position = Integer.parseInt(input);

            boolean highorlow = board.tohighorlow(position);

            boolean succes = board.placeAttempt(position, nextSymbol);

            if (highorlow) {
                if (succes) {
                    if (nextSymbol.equals("x")) {
                        nextSymbol = "o";

                    } else {
                        nextSymbol = "x";
                    }

                }
            }

            board.ShowBoard();

            if (board.checkWinner("x") == true) {
                System.out.println("x wins");
                scan.close();
            }
            if (board.checkWinner("o") == true) {
                System.out.println("x wins");
                scan.close();
            }

        }

    }

}

主要班级

package boter_kaas_en_eiren;

public class MainClass {

    public static void main(String[] args) {


        Game game = new Game();



        game.play();
    }

}

董事会成员

package boter_kaas_en_eiren;

import java.util.Scanner;

public class Board {

    private String[] board;

    public Board() {
        board = new String[9];

        for (int i = 0; i < board.length; i++) {
            board[i] = " ";
        }

    }

    public void ShowBoard() {

        System.out.println(board[0] + "|" + board[1] + "|" + board[2]);
        System.out.println(board[3] + "|" + board[4] + "|" + board[5]);
        System.out.println(board[6] + "|" + board[7] + "|" + board[8]);
        System.out.println("");

    }

    public boolean tohighorlow(int position) {
        if (position <= 8 && position >= 0) {
            return true;
        } else {
            System.out.println("Invalid!!");
            return false;
        }
    }

    public boolean placeAttempt(int position, String symbol) {
        if (board[position].equals(" ")) {
            board[position] = symbol;
            return true;
        } else {
            System.out.println("invalid!");
            return false;
        }

    }

    public boolean checkWinner(String symbol) {
        if (board[0].equals(symbol) && board[1].equals(symbol) && board[2].equals(symbol)) {
            return true;
        } else if (board[3].equals(symbol) && board[4].equals(symbol) && board[5].equals(symbol)) {
            return true;
        } else if (board[6].equals(symbol) && board[7].equals(symbol) && board[8].equals(symbol)) {
            return true;
        } else if (board[0].equals(symbol) && board[3].equals(symbol) && board[6].equals(symbol)) {
            return true;
        } else if (board[1].equals(symbol) && board[4].equals(symbol) && board[7].equals(symbol)) {
            return true;
        } else if (board[2].equals(symbol) && board[5].equals(symbol) && board[8].equals(symbol)) {
            return true;
        } else if (board[0].equals(symbol) && board[4].equals(symbol) && board[8].equals(symbol)) {
            return true;
        } else if (board[2].equals(symbol) && board[4].equals(symbol) && board[6].equals(symbol)) {
            return true;
        } else {
            return false;
        }
    }

}

2 个答案:

答案 0 :(得分:1)

如果您要彻底检查异常中给出的源代码行,您可能会自己找到问题。但是这次我们一起讨论它:

<强> ArrayIndexOutOfBoundsException异常

这意味着您正在尝试访问一个根本不存在的数组元素。 在Game课程中,您有两行:

boolean highorlow = board.tohighorlow(position);
boolean succes = board.placeAttempt(position, nextSymbol);

查看tohighorlow(),我们找到了这一行:

if (position <= 8 && position >= 0) {
    return true;
}

但是,如果数字在[0..8]范围内,则返回true。换句话说,当您的数字既不太高也不太时,该方法会返回true。最简单的修复就是改变这样的条件:

if (position > 8 || position < 0) 

现在大于8或小于0的数字将产生true,这似乎是该方法应该做的事情。或者,您可以交换ifelse的正文。

无论如何,当您在placeAttempt()课程中调用Game时,您忽略了此方法的结果。这不好,因为看placeAttempt()我们找到了这一行:

 if (board[position].equals(" ")) { /* ... */

这是你的异常发源地。您正在访问board数组而不检查position值。或者更确切地说,您确实检查了position值,但不尊重该检查的结果。因此,如果position-212,则会遇到麻烦,因为这些元素不存在(超出范围)。

IllegalStateException:扫描程序已关闭

让我们暂时简化play()课程的Game方法:

public void play() {
    Scanner scan = new Scanner(System.in);
    /* ... */

    while (gameFinished == false) {
        String input = scan.nextLine();
        /* ... */

        boolean highorlow = board.tohighorlow(position);
        boolean succes = board.placeAttempt(position, nextSymbol);
        /* ... */

        if (board.checkWinner("x") == true) {
            System.out.println("x wins");
            scan.close();
        }
        if (board.checkWinner("o") == true) {
            System.out.println("x wins");
            scan.close();
        }
    }
}

您要做的第一件事就是创建Scanner。现在,在某些情况下(最后两个if),您关闭扫描仪。但是,您在循环中执行此操作。关闭扫描仪后,循环将从第一行开始:

String input = scan.nextLine();

但你无法获得关闭扫描仪的下一行。

附加说明

我注意到你的风格很不协调。例如,请参阅以下三个方法名称:ShowBoardplaceAttempttohighorlow。您为每个使用不同的大写。我强烈建议坚持使用recommended naming convention,这意味着首字母较低的camelCase:showBoardplaceAttempttooHighOrLow(另请注意to vs {{1 }})。

希望这有帮助。

答案 1 :(得分:0)

您的阵列板的大小为9.因此,如果有人输入的数字不在0到8之间,则会出现例外情况。 您将用户的输入直接传递给您的函数:

board.placeAttempt(position, nextSymbol);

你做了:

 if (board[position].equals(" ")) {

所以你试图访问数组的无效位置