Java - 将null引用传递给构造函数的对象,然后再创建实例

时间:2018-05-25 15:44:13

标签: java reference

我必须创建一个对象Th的“循环列表”。 T0,T1,T2,...,TN-1 每个对象都拥有对它的权限的引用 所以T0有T1参考....而TN-1有T0参考。

class Th
{
    private Th nextTh;
    Th(Th n) {
        nextTh=Th;
    }
}

在主要方法中,我这样做

 Th[] th = new Th[N]; //Create the references
 for (int i = 0; i < N; i++)
     th[i]= new Th(th[(i+1)%(N)],first,shared,i,N,counter); 

如您所见,当for循环中i = 0时,我创建了新的Object Th,并在构造函数中传递了参数th[i+1](所以th[1]),此刻它是一个参考到一个null对象,但我在下一步i = 1中创建它。 事实上,当我在Th类内部引用nextTh时,我得到NullPointerException

class Th {
     ....
    doSomething() {
        nextTh.foo(); //Throws NullPointerException
    }
}

我知道Java只是按值传递参数,从原始它传递副本而对于Object传递参数的副本(对吗?)。

谢谢。

3 个答案:

答案 0 :(得分:0)

当您尝试分配th[i]= new Th(th[(i+1)%(N)],first,shared,i,N,counter)时,th[(i+1)%N]的实际值为null。 (除了i=N-1,当你指向先前已分配的[0]时。

您需要先创建“目标”元素,并添加getter和setter以编辑th字段。

答案 1 :(得分:0)

编写您的主要方法,如下所示

    // N = 30, just for testing
    final int N = 30;
    Th[] thArr = new Th[N];

    // first element
    Th th0 = new Th(null, 0);
    // initialize first element into array
    thArr[0] = th0;
    // general element
    Th thNext;

    // loop
    for (int i = 1; i < N; i++) {
        thNext = new Th(null, i);
        thArr[i - 1].nextTh = thNext;
        thArr[i] = thNext;
    }
    // setting next element of last element to first element
    thArr[N - 1].setNextTh(th0);

答案 2 :(得分:0)

从您的问题中不清楚Th(th[(i+1)%(N)],first,shared,i,N,counter)是什么,但由于它在传递NullPointerException作为第一个参数时抛出null,因此您无法在至少对于Th个实例中的一个。

我建议您使用Th构造函数创建第一个Th(Th n)实例,并将null传递给它:

th[0] = new Th(null);

然后您可以按相反的顺序创建其他实例:

for (int i = N - 1; i > 0; i--) {
    th[i] = new Th(th[(i+1)%(N)],first,shared,i,N,counter); 
}

最后,修改th[0]

th[0].setNext(th[1]);

这将关闭周期。