Java - передать нулевую ссылку на объект конструктора и создать экземпляр позже - PullRequest
0 голосов
/ 25 мая 2018

Мне нужно создать «круговой список» объекта Th.T0, T1, T2, .., TN-1 Каждый объект имеет ссылку на одно право на него. Таким образом, T0 имеет ссылку T1 .... и TN-1 имеет ссылку T0.

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

Inосновной метод я делаю это

 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); 

Как вы можете видеть, когда я = 0 в цикле for, я создаю новый объект Th и в конструкторе я передаю аргумент th[i+1] (так что th[1]) что в данный момент это ссылка на нулевой объект, но я создам его на следующем шаге i = 1.Фактически, когда внутри класса Th я ссылаюсь на nextTh и получаю NullPointerException.

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

, я знаю, что Java передает параметры только по значению, из примитивов она делает копию, а для Object этопередает "копию ссылки (верно?).

Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

напишите ваш основной метод, как показано ниже

    // 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);
0 голосов
/ 25 мая 2018

Из вашего вопроса непонятно, что означает 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]);

Это закроет цикл.

0 голосов
/ 25 мая 2018

Когда вы пытаетесь присвоить th[i]= new Th(th[(i+1)%(N)],first,shared,i,N,counter), фактическое значение th[(i+1)%N] равно null.(кроме i=N-1, когда вы укажете на th [0], который был назначен ранее.

Сначала вам нужно создать свой «целевой» элемент, а также добавить геттеры и сеттеры для редактирования th поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...