我目前在使用Java中的二维数组创建对象时遇到问题。
我喜欢在游戏板上显示积木(就像在经典的“ BreakOut游戏”中一样),因此我为石头对象创建了一个“ Stone”类,该类的构造函数为:
public Stone (Position pos, int value){
this.pos = pos;
this.type = type;
}
我还为Stones的模式创建了一个称为“ stoneTypes”的2D数组(int),在其中保存了JSON文件中的矩阵。
我现在想通过使用stoneTypes-matrix的值在我的“级别”类中创建Stone对象,该对象当前看起来像这样(我包含了if条件,因此Stone对象仅针对stoneTypes值> = 1):
private Stone[][] stones = new Stone[25][20];
private int[][] stoneTypes;
JSONReader reader = new JSONReader("res/Level" + levelnr +".json");
stoneTypes = reader.getStones2DArray();
for (int w = 0; w < stoneTypes.length; w++) {
for (int h = 0; h < stoneTypes[w].length; h++) {
if (stoneTypes [w][h] >= 1) {
Position pos = new Position(width * w, height * h);
this.stones[w][h] = new Stone(pos, stoneTypes[w][h]);
}
}
}
我还为Stone数组添加了一个get-Method,因此我可以使用它在“ Field”类中绘制Stones:
public Stone[][] getStones(){
return this.stones;
}
目前在“ Field”类中绘制“石头”的方法如下:
private void drawStones(Graphics2D g2) {
stones = view.getGame().getLevel().getStones();
for (int i = 0; i < stones.length; i++) {
for (int j = 0; j < stones[i].length; j++) {
*** int x_position = (int) stones[i][j].getPosition().getX(); ***
int y_position = (int) stones[i][j].getPosition().getY();
g2.fillRoundRect(x_position, y_position,
(int) ((double)Constants.SCREEN_WIDTH/Constants.SQUARES_X)-2,
(int) ((double)Constants.SCREEN_HEIGHT/Constants.SQUARES_Y)-2 ,1,1);
System.out.println(x_position);
}
}
}
Eclipse没有显示任何语法错误,但是在我启动程序后,我确实在标有***的位置收到NullPointerException。我不确定我的get-Method是否正确实现,或者创建新的Stone对象的过程是否完全错误。我尝试了数百种方法,但找不到解决方案,希望你们能帮助我。
提前谢谢,斯科帕!
答案 0 :(得分:1)
这里:
if (stoneTypes [w][h] >= 1) {
Position pos = new Position(width * w, height * h);
this.stones[w][h] = new Stone(pos, stoneTypes[w][h]);
}
只有在满足该条件时,您才可以创建新的宝石。所有其他字段将保留其默认初始值。那将是:null。
这样做时,您不能只是(无条件)走进去做
:int x_position = (int) stones[i][j].getPosition().getX()
您需要
if (stones[i][j] != null)
保护此类访问!