尝试将子类对象添加到超类数组时出现ArrayStoreException错误

时间:2017-01-05 21:10:49

标签: java oop

我正在制作一个跳棋游戏,并有以下课程。 摘要类:

public abstract class Piece {

protected Position position;
private CheckersColor color;

public Piece(CheckersColor color, Position position) {
    this.position = position;
    this.color = color;

}

使用更多方法。

子类Checker:

public class Checker extends Piece {

public Checker(CheckersColor color, Position position) {
    super(color, position);
}

还有一些方法,还有另一个子类王:

public class King extends Piece {

public King(CheckersColor color, Position position) {
    super(color, position);
}

public King(Piece checker) {
    super(checker.getColor(), checker.position);
}

检查器存储在Piece

类型的数组中
private Piece[] whiteCheckers;

并插入:

whiteCheckers[counter] = new Checker(Constants.COLOR_WHITE, tempPosition);

到目前为止一切正常,但当我尝试将其中一个棋子改为国王时,我收到了错误:

  

线程“main”中的异常java.lang.ArrayStoreException:King

导致错误的代码:

whiteCheckers[i] = new King(piece);

我已经尝试了几种不同的方式来存储它,使用铸造,移除检查器并在相同位置添加国王以及更多而没有运气。

这对我来说真的很奇怪,因为检查器存储没有问题,而且当它们都是Piece的子类时,king会导致错误。

非常感谢!

修改

public class Board {
private int size;
private Piece[] blackCheckers;
private Piece[] whiteCheckers;
private Piece[][] board;

public Board(int size) {
        ....(Some other code)

        for (int k = 0; k < whiteCheckers.length; k++) {
            board[whiteCheckers[k].position.getRow()][whiteCheckers[k].position.getColumn()] = whiteCheckers[k];
            board[blackCheckers[k].position.getRow()][blackCheckers[k].position.getColumn()] = blackCheckers[k];

        }

    } else {
        throw new RuntimeException("The size is either smaller than 4 or is not even");
    }
}
    ....(Some more methods)

public void verifyCrown(Piece piece) {
    if ((piece.getColor().equals(Constants.COLOR_WHITE) && piece.position.getRow() == 0)
            || piece.getColor().equals(Constants.COLOR_BLACK) && piece.position.getRow() == size - 1) {

        if (piece.getColor().equals(Constants.COLOR_WHITE)) {
            for (int i = 0; i < whiteCheckers.length; i++) {
                if (whiteCheckers[i].equals(piece)) {
                    whiteCheckers[i] = new King(piece);

                }
            }
        }

        if (piece.getColor().equals(Constants.COLOR_BLACK)) {
            for (int i = 0; i < blackCheckers.length; i++) {
                if (blackCheckers[i].equals(piece)) {
                    blackCheckers[i] = new King(piece);

                }
            }
        }
    ....
    }
}

}

1 个答案:

答案 0 :(得分:1)

您能告诉我们数组是如何初始化的吗? 原因可能是您按如下方式初始化数组:

Piece[] whiteCheckers = new Checker[n];

而不是

Piece[] whiteCheckers = new Piece[n];

不允许您向其添加King类型的对象。

但是再次没有看到数组是如何初始化的,情况可能并非如此。