Как исправить NullPointerException для массива при переключении на другой метод - PullRequest
0 голосов
/ 10 февраля 2019

Я создаю шахматную игру на Java, которая требует создания двумерного массива объектов для создания шахматной доски.Массив отображается как имеющий все объекты внутри него при его создании, но когда я вызываю другой метод из другого объекта, массив внезапно заполняется нулевыми значениями.

Это в Java, включая некоторые JavaFX (Я не думаю, что JavaFX влияет на что-либо, но он помечен на всякий случай), запущенный в Eclipse.Я попытался напечатать массив в нескольких местах, и он работает только внутри createBoard (), а не setBoard () (или метода startGame () графического интерфейса пользователя.

public class ChessGame {
    public static void main(String[] args) {
        GUI gui = new GUI();
        Application.launch(GUI.class, args);
        Player player1 = new Player();
        Player player2 = new Player();
        gui.startGame(player1, player2);
    }
}
public class GUI extends Application {
    Board chessBoard = new Board();

    @Override
    public void start(Stage primaryStage) {
        GridPane chessBoardPane = chessBoard.createBoard();
        primaryStage.setScene(new Scene(chessBoardPane, 400, 400));
        primaryStage.show();
    }

    public void startGame(Player player1, Player player2) {
        //printing the array here still produces nulls.
        chessBoard.setBoard(player1, player2);
    }

}
public class Board {
    private BoardSquare[][] boardArray;
    public static int boardSize = 8;
    //private GridPane boardGrid = null;

    public Board() {
        boardArray = new BoardSquare[boardSize][boardSize];  
    }

    public GridPane createBoard() {
        GridPane chessBoard = new GridPane();
        for (int x = 0; x < boardSize; x++) {
            for (int y = 0; y < boardSize; y++) {
                StackPane square = new StackPane();
                String color;
                if ((x + y) % 2 == 0) {
                    color = "white";
                } else {
                    color = "black";
                }
                square.setStyle("-fx-background-color: " + color + ";");
                chessBoard.add(square, y, x);
                boardArray[x][y] = new BoardSquare(x, y, color, square, null);
            }
        }
        for (int i = 0; i < boardSize; i++) {
            chessBoard.getColumnConstraints().add(new ColumnConstraints(5, Control.USE_COMPUTED_SIZE, Double.POSITIVE_INFINITY, Priority.ALWAYS, HPos.CENTER, true));
            chessBoard.getRowConstraints().add(new RowConstraints(5, Control.USE_COMPUTED_SIZE, Double.POSITIVE_INFINITY, Priority.ALWAYS, VPos.CENTER, true));
        }
        //at this point, printing the x and y values of the array is possible.
        return chessBoard;
    }

    public void setBoard(Player player1, Player player2) {
        Player currentPlayer = player1;
        for (int x = 0; x < boardSize; x++) {
            for (int y = 0; y < boardSize; y++) {
                //if (boardArray[x][y] != null) {  <-- error occurs if removed
                    if (y == 0) {
                        if (x == 0 || x == 7) {
                            Rook rook = new Rook(currentPlayer);
                            boardArray[x][y].setPiece(rook); //<-- error
                        }
//etc.

Печать boardArray's xи значения y внутри createBoard выводят координаты ожидаемой сетки 8x8. boardArray по-прежнему должен быть заполнен значениями BoardSquare при переходе к setBoard (), но теперь внезапно все значения становятся нулевыми и при попытке печати значений массива x и y происходитничего. Я понятия не имею, почему массив внезапно пуст.

1 Ответ

0 голосов
/ 10 февраля 2019

С вашим методом main есть 2 проблемы:

  1. Вы создаете свой собственный экземпляр класса GUI, который отличается от того, который запускается при вызове Application.launch.start никогда не вызывается для экземпляра GUI, который вы создаете в main.
  2. Application.launch блоках, до выхода из приложения.К тому времени, когда это произойдет, уже слишком поздно передавать какую-либо информацию для использования в графическом интерфейсе.

Экземпляр Application, созданный Application.launch, служит точкой входа для приложения.По этой причине вы должны переместить этот тип инициализации в метод start:

 @Override
public void start(Stage primaryStage) {
    GridPane chessBoardPane = chessBoard.createBoard();

    Player player1 = new Player();
    Player player2 = new Player();
    this.startGame(player1, player2);

    primaryStage.setScene(new Scene(chessBoardPane, 400, 400));
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...