我在一个数组中有一个数组,想要为每个循环初始化它。
// 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。怎么会这样?我在这里错过了什么?谢谢!
编辑:哦,我很抱歉,这不是主要的,而是循环的构造方法。
答案 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]
未被赋予任何值。