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 打印初始化的树,所以它们被初始化了。我以为一切都好。但是当我尝试使用这些树时,我得到了一个空指针异常。所以我尝试再次遍历数组,第二个 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

您的问题在第一个循环中:

tree2 = new Tree();

此行确实创建了实例,Tree但它将其存储在局部变量tree2而不是数组元素中this.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();,第一个将实例存储在数组元素中,第二个将其存储在单个变量中。

Java 引用不是 C 指针。对象的赋值是按值赋值的引用。

于 2013-01-24T09:58:04.597 回答
1

在这个 for 循环中

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

您正在对局部引用变量进行赋值tree2,其中 astree[i][j]没有被分配任何值。

于 2013-01-24T09:58:55.673 回答