Почему я получаю исключение NullPointerException при создании компонента Swing? - PullRequest
0 голосов
/ 12 января 2011

Ошибка возникает при создании объекта Box.

    public void drawBoard(Board board){
    for(int row = 0; row < 8; row++){
        for(int col = 0; col < 8; col++){
            Box box = new Box(board.getSquare(col, row).getColour(), col, row);
            squarePanel[col][row].add(box);
        }
    }

Доска дается от конструктора Game здесь (другой класс):

public Game() throws Throwable{
    View graphics = new View();
    board = new Board();
    board.setDefault();
    graphics.drawBoard(board);
}

Конструктор Board выглядит следующим образом:

public Board(){
    grid = new Square[COLUMNS][ROWS];
    for(int row = 0; row < 8; row++){
        for(int col = 0; col < 8; col++){
            grid[col][row] = new Square(this);
        }
    }
    for(int row = 0; row < 8; row++){
        for(int col = 0; col < 4; col++){
            int odd = 2*col + 1;
            int even = 2*col;
            getSquare(odd, row).setColour(Color.BLACK);
            getSquare(even, row).setColour(Color.WHITE);
        }
    }
}

И, наконец, класс Box:

class Box extends JComponent{
Color boxColour;
int col, row;
public Box(Color boxColour, int col, int row){
    this.boxColour = boxColour;
    this.col = col;
    this.row = row;
    repaint();
}
public void paint(Graphics drawBox){
    drawBox.setColor(boxColour);
    drawBox.drawRect(50*col, 50*row, 50, 50);
    drawBox.fillRect(50*col, 50*row, 50, 50);
    }
}

Так что при циклическом перемещении массива он использует два целых числа в качестве координат для создания Box.На координаты ссылаются, а затем запускается repaint ().Поле также получает цвет, используя два целых числа, из квадрата в классе Board.Поскольку цвет уже задан, до запуска метода drawBoard (board) это не должно быть проблемой, верно?

Exception in thread "main" java.lang.NullPointerException
    at View.drawBoard(View.java:38)
    at Game.<init>(Game.java:21)
    at Game.main(Game.java:14)

Соответствующая часть Square

import java.awt.Color;

public class Square {

    private Piece piece;
    private Board board;
    private Color squareColour;

public Square(Board board){
    this.board = board;
}

public void setColour(Color squareColour){
    this.squareColour = squareColour;
}

public Color getColour(){
    return squareColour;
}

Ответы [ 2 ]

1 голос
/ 12 января 2011

В вашем методе drawBoard () есть 2 места, которые могут вызвать исключение NullPointerException

Box box = new Box(board.getSquare(col, row).getColour(), col, row);

, если board равно нулю или результат getSquare равен нулю, тогда вы увидите NPE.

Другая область и очень распространенное место, где люди выбрасывают NullPointerExceptions:

squarePanel[col][row].add(box);

Поскольку вы не показали нам, как вы это объявляете, я буду предполагать следующее, вы создали JPanel на этой панелиВы не создали новый экземпляр для массива 8x8.Поэтому, когда вы добавляете () новое поле, оно генерирует исключение NullPointerException

. Это помогло бы больше, если бы вы также могли сказать нам, какая строка 38 находится в вашем View классе

0 голосов
/ 12 января 2011

Предположение, потому что вы не указали полный исходный код - но для циклов вы, кажется, жестко запрограммировали количество строк и столбцов, но для объявления массива двумерной сетки вы использовали две константы.

В зависимости от вашей реализации getSquare и от того, отличаются ли эти константы от ваших жестко заданных значений, это может быть причиной проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...