我正在研究一个java项目。当我第一次开始时,我在一个java类中有很多代码。这开始变得非常混乱所以我试图将代码传播到其他类。这是我遇到阵列问题的地方。
我创建了一个创建数组的类,数组有一个getter方法,所以我的主类可以使用它。
saveAs()
在主类我用这个
public class CreateBlockArray {
private static int[][][] blockarray;
public CreateBlockArray(){
//get coordinates
//fill array
int[][][] blockarray = new int[Xdelta+ 10][Ydelta + 10][Zdelta + 10];
blockarray = fillarray(Xlow,Ylow, Zlow, Xhigh, Yhigh, Zhigh, blockarray );
blockarray = getvisibleBlocks(Xlow,Ylow, Zlow, Xhigh, Yhigh, Zhigh, blockarray);
blockarray = filloceanfloor(Xlow,Ylow, Zlow, Xhigh, Yhigh, Zhigh, blockarray);
//these three methods modify array and than return it
}
public int[][][] getBlockarray() {
return blockarray;
}
这给出了一个空指针异常。 从stackilaflow上的similair问题我明白数组不是原始数据而是参考。
所以我尝试用这段代码逐块复制数组
CreateBlockArray Array = new CreateBlockArray();
int[][][] blockarray = Array.getBlockarray();
//more code
if (blockarray[i][k][j] != 0) //it crashes here
当我返回时,一切正常,我没有错误。 我还可以返回第一个数组而不必复制吗?
答案 0 :(得分:5)
问题出在这个构造函数中:
public CreateBlockArray(){
//get coordinates
//fill array
int[][][] blockarray = new int[Xdelta+ 10][Ydelta + 10][Zdelta + 10];
blockarray = fillarray(Xlow,Ylow, Zlow, Xhigh, Yhigh, Zhigh, blockarray );
blockarray = getvisibleBlocks(Xlow,Ylow, Zlow, Xhigh, Yhigh, Zhigh, blockarray);
blockarray = filloceanfloor(Xlow,Ylow, Zlow, Xhigh, Yhigh, Zhigh, blockarray);
//these three methods modify array and than return it
}
当你在方法中重新声明它时,你并没有真正修改类的blockarray
:
int[][][] blockarray = new int[Xdelta+ 10][Ydelta + 10][Zdelta + 10];
只需更改
的那一行blockarray = new int[Xdelta+ 10][Ydelta + 10][Zdelta + 10];
并删除该行中的static
标识符:
private static int[][][] blockarray;
答案 1 :(得分:2)
在这里声明你的数组:
private static int[][][] blockarray;
但是在构造函数中,您再次将其声明为局部变量:
int[][][] blockarray = new int[Xdelta+ 10][Ydelta + 10][Zdelta + 10];
因此,所有操作都在本地数组而不是字段上完成。
避免再次声明,只需写下
blockarray = new int[Xdelta+ 10][Ydelta + 10][Zdelta + 10];
在构造函数中,然后它将使用该字段。
当然,如果您希望数组成为类状态的一部分,则不能将其声明为静态,或者只有一个数组在该类的所有实例之间共享。也许您根本不需要构造函数,只需要一个静态初始化块。