访问多维数组时抛出NullPointerException

时间:2012-12-24 14:42:07

标签: java multidimensional-array

我正在尝试制作一款需要你放置块的游戏,类似于Minecraft。但是,我一直在尝试制作一个多维数组,这将存储放置的块的x和y坐标。代码如下:

public Block[][] blocks = new Block[maxBlockX][maxBlockY];

它给了我一个空指针异常。例外如下;

Exception in thread "main" java.lang.NullPointerException
    at net.lojana.src.World.loadWorldAsReg(World.java:16)
    at net.lojana.client.SpriteCraft.display(SpriteCraft.java:45)
    at Run.main(Run.java:5)

在我的World类中引用了以下方法loadWorldAsReg()。方法就在这里。

public void loadWorldAsReg() {
    for (int x = 0; x < maxBlockX; x += 20) {
        for (int y = 0; y < maxBlockY; y += 20) {
            blocks[x][y].draw();
        }
        }
}

它也引用了以下方法。

public void draw() {
    getTexture().bind();
    shapes.drawSquare(new Point(x, y), new Point(x + 20, y + 20));
}

有没有人知道如何解决这个奇怪的错误? 非常感谢!

3 个答案:

答案 0 :(得分:3)

您的数组已满{4}个。

您需要先为数组中的每个元素创建一个null实例。

答案 1 :(得分:0)

更改为:

public void loadWorldAsReg() {
    for (int x = 0; x < maxBlockX; x += 20) {
        for (int y = 0; y < maxBlockY; y += 20) {
        blocks[x][y] = new Block();
        blocks[x][y].draw();
    }
    }
}

在使用对象之前调用构造函数。假设您的代码有一个,我使用了默认构造函数Block()。如果构造函数需要参数,请包含参数。 :)

答案 2 :(得分:0)

编写Block[][] blocks = new Block[maxBlockX][maxBlockY]将创建一个大小为maxBlockX * maxBlockY的二维数组,其中只包含空值。

新的DATA_TYPE [size1] [size2]只会填充PRIMITIVE数据类型的默认值。所以新的int [2] [1]将创建一个数组[[0],[0]],新的Block [2] [1]将创建[[null],[null]]。

只需正确初始化你的积木,你就会被设定。

Block[][] blocks = new Block[maxBlockX][maxBlockY];
for (int i=0; i<blocks.length; i++)
  for (int j=0; j<blocks[0].length; j++)
    blocks[i][j] = new Block();

您还可以通过检查loadWorld函数来避免绘制错误(null)数据。这也可能让你的生活更轻松,不知道:

public void loadWorldAsReg() {
  for (int x = 0; x < maxBlockX; x += 20) {
    for (int y = 0; y < maxBlockY; y += 20) {
      if (blocks[x][y] != null)
        blocks[x][y].draw();
    }
  }
}