不能在A类中获取数组以在B类中工作

时间:2015-06-04 19:26:55

标签: java arrays

我正在研究一个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

当我返回时,一切正常,我没有错误。 我还可以返回第一个数组而不必复制吗?

2 个答案:

答案 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];

在构造函数中,然后它将使用该字段。

当然,如果您希望数组成为类状态的一部分,则不能将其声明为静态,或者只有一个数组在该类的所有实例之间共享。也许您根本不需要构造函数,只需要一个静态初始化块。