在多维数组中创建对象的问题

时间:2019-01-30 15:24:29

标签: java arrays multidimensional-array

我目前在使用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对象的过程是否完全错误。我尝试了数百种方法,但找不到解决方案,希望你们能帮助我。

提前谢谢,斯科帕!

1 个答案:

答案 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) 

保护此类访问!