3

配列内に配列があり、for each ループで初期化したいと考えています。

// class variable  
Tree[][] trees;

// in constructor

this.trees = new Tree[length][with];

// initialize
for (Tree[] tree : this.trees){
    for(Tree tree2 : tree){
    tree2 = new Tree();
    System.out.println(tree2);
    }
}

for (Tree[] tree : this.trees) {
    for (Tree tree2 : tree) {
    System.out.println(tree2);
    }
}

何が起こるかというと、最初の println が初期化されたツリーを出力するため、初期化されます。私はすべてが大丈夫だと思った。しかし、これらのツリーを使用しようとすると、nullpointerexception が発生します。そのため、配列を再度ループしようとしたところ、2 番目の println ですべてのツリーに対して null が返されました。どうすればいいの?ここで何が欠けていますか?ありがとうございました!

編集:ああ、申し訳ありません。メインではなく、ループが配置されているコンストラクターメソッドです。

4

4 に答える 4

3

tree2はローカル変数 (ループのスコープで使用可能) であり、新しく作成されたTreeインスタンスを配列ではなくその変数に割り当てます。次に、その変数の内容を出力して、動作しているように見えます...

trees代わりに、次のように明示的にインスタンスを に格納する必要があります。

for (int l = 0; l < length; l++){
  for(int h = 0; h < height; h++) {
    trees[l][h] = new Tree();
    System.out.println(trees[l][h]);
  }
}

ご覧のとおり、インスタンスを配列に格納し、配列を使用し値を出力します。

于 2013-01-24T09:56:08.843 に答える
2

上記の私のコメントによると、これは:

for (Tree[] tree : this.trees){
    for(Tree tree2 : tree){
    tree2 = new Tree(); // changes tha variable tree2, does not touch the array.
    System.out.println(tree2);
    }
}

効果はありません。あなたが必要

for (int i = 0; i < length; i++) {
    for (int j = 0; j < width; j++) {
        trees[i][j] = new Tree(); // obviously changes the array content.
    }
}
于 2013-01-24T09:57:17.703 に答える
1

このforループで

for(Tree tree2 : tree)
{
    tree2 = new Tree();

ローカル参照変数への割り当てを行っていますがtree2、 as にtree[i][j]は値が割り当てられません。

于 2013-01-24T09:58:55.673 に答える
1

あなたの問題は最初のループにあります:

tree2 = new Tree();

この行は実際にのインスタンスを作成しますが、配列の要素ではなくTreeローカル変数に格納します。tree2this.trees

inexed for ループを使用して配列を反復処理する必要があります。

for (int i = 0; i < trees.length; i++) {
    for (int j = 0; j < trees[i].length; j++) {
        threes[i][j] = new Tree();
    }
}

threes[i][j] = new Tree();と の行の違いtree = new Tree();は、最初にインスタンスを配列の要素に格納し、2 番目にそれを単一の変数に格納することです。

Java 参照は C ポインターではありません。オブジェクトの割り当ては、値による参照の割り当てです。

于 2013-01-24T09:58:04.597 に答える