Java数组未保持初始化状态

时间:2013-01-24 09:52:06

标签: java arrays for-loop initialization

我在一个数组中有一个数组,想要为每个循环初始化它。

// 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。所以我试图再次遍历数组,第二个println为每个树提供null。怎么会这样?我在这里错过了什么?谢谢!

编辑:哦,我很抱歉,这不是主要的,而是循环的构造方法。

4 个答案:

答案 0 :(得分: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]);
  }
}

如您所见,它将实例存储在数组中,并使用数组来打印值。

答案 1 :(得分: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.
    }
}

答案 2 :(得分:1)

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

tree2 = new Tree();

这一行确实创建了Tree的实例,但它将其存储在局部变量tree2中,而不是存储在数组this.trees的元素中。

你应该使用unsed 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指针。对象的分配是按值分配引用。

答案 3 :(得分:1)

在这个for循环中

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

您正在对本地引用变量tree2进行分配,其中tree[i][j]未被赋予任何值。