我正在尝试制作一款需要你放置块的游戏,类似于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));
}
有没有人知道如何解决这个奇怪的错误? 非常感谢!
答案 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();
}
}
}