bugfix> java > 投稿

オブジェクト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の場合、新しいオブジェクトThを作成し、コンストラクターで引数 th[i+1] を渡します(だから th[1] )現時点ではnullオブジェクトへの参照ですが、次のステップi = 1で作成します。 実際、Thクラス内でnextThを参照すると、 NullPointerException が取得されます。 。

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

Javaは値によってパラメーターを渡していることを知っています。プリミティブからコピーを作成し、オブジェクトに対しては「参照のコピーを渡します(右?)」

ありがとうございました。

回答 3 件
  • th[i]= new Th(th[(i+1)%(N)],first,shared,i,N,counter) を割り当てようとするとき 、 th[(i+1)%N] の実際の値  は null です 。 (それから i=N-1 、以前に割り当てられたth [0]を指す場合。

    最初に「ターゲット」要素を作成し、ゲッターとセッターを追加して th を編集する必要があります  フィールド。

  • 以下のようにメインメソッドを書きます

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

  • あなたの質問から、 Th(th[(i+1)%(N)],first,shared,i,N,counter) は何をするのか明確ではありません 、しかし、 NullPointerException をスローするため   null が渡されたとき  最初の引数として、少なくとも1つの 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]);
    
    

    これにより、サイクルが終了します。

あなたの答え