2013-01-24 49 views
3

我已經在數組中有一個數組,並且想要爲每個循環初始化一個數組。Java數組未保持初始化

// 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

你不能在'main'方法中使用'this',因爲'main'是'static'。此外,這個代碼'tree2 = new Tree();'完全沒有效果,因爲'tree2'只是循環中的一個局部變量。沒有辦法按照你想要的方式用每個循環來初始化對象。 – jlordo

回答

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指針。對象的分配是按值分配引用。

在此
+0

很好的解釋!感謝你們所有人。 – Linus

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]); 
    } 
} 

正如你所看到的,IT賣場數組中的實例並使用數組來打印該值。

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. 
    } 
} 
1

for循環

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

你正在做分配給本地參考變量tree2,其中爲tree[i][j]沒有得到分配任何價值。