8

私はその問題に素早く飛び込みます。私は簡単なクラスを持っています

class Vector{
    float x, y;
}

そして別のクラスはそのメンバーとしてこれらのオブジェクトの配列を持っています

Vector[] buffer;

私はそれを次のように初期化します:

buffer = new Vector[8];
for(Vector v: buffer)
    v = new Vector();

しかし、この配列内のこのオブジェクトのメンバーにアクセスしようとすると、スタックトレースに直接NullPointerExceptionが発生します。つまり、配列のオブジェクトは作成されていません。一方、このより伝統的なコードは完璧に機能します。

buffer = new Vector[8];
for(int i = 0; i<8; i++)
    buffer[i] = new Vector;

この議論が指摘しているように、コンパイル後は両方とも同じである必要があります

私の質問は、なぜ各ループがアイテム配列からオブジェクトを初期化/構築できないのですか?

4

3 に答える 3

5

for-eachの例では、配列に保存されないループのローカル変数を上書きしています。これは、2番目のループの場合と似ています。

for(int i = 0; i < buffer.length; i++){
    Vector v = buffer[i];
    v = new Vector();
}

基本的に同じ問題については、Javaの各ループの理解を確認してください。

于 2012-09-04T01:32:50.463 に答える
5

両方のループは、配列から要素にアクセスする場合は同じですが、初期化する場合は同じではありません。このシナリオでfor-eachループを使用すると、次のようになります。

for(int x = 0; x < array.length; x++) {
    Vector v = array[x];
    v = new Vector();
}

newVectorを配列に割り当てるのではなく、ローカル変数に割り当てます。

于 2012-09-04T01:34:21.847 に答える
2

最初の例でvは、forループ内でのみ使用できます。実行すると、v = new Vector();vは更新されますが、buffer[i]は更新されません。vは以前はbuffer[i]を指していたが、現在は新しいベクトルを指しており、buffer[i]そのままであるnull

于 2012-09-04T01:49:35.627 に答える