我想做一个游戏,需要你放置块,类似于我的世界。但是,我已经得到了一些麻烦,试图使一个多维数组,将存储的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 class中引用了以下方法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));
}
有人知道如何解决这个奇怪的错误吗?感谢!
您的数组中满是null
。
您需要首先为数组中的每个元素创建一个Block
实例
改成:
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()
,我使用了它。包括构造函数需要的参数。:)
写入Block[][] blocks = new Block[maxBlockX][maxBlockY]
将创建一个大小为maxBlockX * maxBlockY的二维数组,其中只包含null。
新的DATA_TYPE[size1][size2]将只填充原始数据类型的默认值。因此,new int[2][1]将创建一个数组[[0],[0]],new Block[2][1]将创建一个数组[[null],[null]]。
只要正确地初始化你的block,你就会设置好。
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();
}
}
}