我必须创建一个对象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传递参数的副本(对吗?)。
谢谢。
答案 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]);
这将关闭周期。