0

作成中のプログラムに問題があり、何が問題なのかわかりません。問題が何であるかを理解しようとするために、いくつかの小さなテストクラスを作成しましたが、わかりません。配列がどのように機能するかについての基本的なことだと確信していますが、何を思い出せないようです。だから私はここにクラスを投稿し、あなたたちが何が悪いのか知っていることを願っています. ありがとう!

public class Main {

    public static void main(String[] args) {
        TestArray t = new TestArray(8);
        t.set(1, 15);
        t.print();
    }

}


public class TestArray {
    private Word[] a;

    public TestArray(int i){
        a = new Word[i];
    }

    public void set(int pos, long value){
        a[pos].set(value);
    }

    public void print(){
        for(Word w : a){
            System.out.println(w);
        }
    }
}



public class Word {
    private long value;

    public Word(long value){
        this.value = value;
    }

    public void set(long value){
        this.value = value;
    }

    public String toString(){
        return String.valueOf(value);
    }
}

t.set(1,15) を実行しようとするとエラーが発生し、Eclipse は次の行に何か問題があると言います: a[pos].set(value);

4

2 に答える 2

4

変数の実際の要素を初期化していません。Word[] aメソッドで null の場合は初期化しますTestArray.set

if (a[pos] == null)
    a[pos] = new Word(value);
else 
    a[pos].set(value);

Java のオブジェクト配列の値は に初期化されますnull。これは、プリミティブ配列が初期化される方法とは逆です (すべてゼロまたはそれと同等の値に)。したがって、 を介して配列を作成するとnew Word[i]、実際には要素の配列が作成nullされ、それに応じてすべての要素を設定する必要があります。

set メソッドでこれを行うと、未使用のオブジェクトが作成されないことが保証されWordます。これは遅延初期化と呼ばれます。それを行う別の方法は、コンストラクターですべてをデフォルト値に初期化することです。

public TestArray(int i){
    a = new Word[i];
    for (int index = 0; index < i; index++) {
        a[index] = new Word(0); // Or some other default besides 0, like -1
    }
}

あなたのコメントごと:

これは最善の方法のようですが、実際にやろうとしました: (for-each code)。ここで尋ねる前に、それはうまくいきません。なんで?

あなたのコード:

public TestArray(int i) {
    a = new Word[i];
    for(Word w:a) {
        w = new Word(0);
    }
}

実際の参照wがそうではないため、機能しません。配列の for-each ループでは、コードはコンパイル時に実際にこれを行います。a[index]

for (int $i = 0; $i < a.length; $i++) { 
    Word w = a[$i];
    w = new Word(0);
}

ご覧のとおりw、 の実際の要素ではなく、ローカル変数 に値を割り当てているaため、配列は変更されていません。1 つの注意: $1) $Java 変数名では有効であり (ただし、明示的に使用するべきではありません)、2) Java はコードをコンパイルするときにこれらの変数を生成するため、変数に惑わされないでください (適切なデバッガー)。

于 2012-09-25T22:10:08.660 に答える
3

配列を割り当てますが、要素にアクセスする前に配列要素に何も配置しません。

a[pos].set(value);

nullであるa [pos]にあるものにアクセスしようとします。

配列をループして、各配列要素に TestArray の新しいインスタンスを割り当てる必要があります。

于 2012-09-25T22:09:27.220 に答える