2013-02-14 152 views
2

我有一個類具有一個ArrayList屬性,並且具有該類的2D陣列另一個類:2D陣列

public class someThingsList { 

    private List<someThings> lst; 

    public someThingsList() { 
     this.lst = new ArrayList<someThings>(); 
    } 
    public addThing(someThings) { 
     someThings s = someThings; 
     this.lst.add(s); 
    } 
} 

public class x implements y { 

    private static someThingsList[][] field; 

    public x(int h, int w) { 
    x.field = new someThingsList[h][w]; 
    for (someThingsList[] lst1 : x.field) 
     for (someThingsList lst2 : lst1) 
      lst2 = new someThingsList(); 
} 

,當我有例如用(2,2)爲H和W新的X對象,並嘗試做

x.fields[0][0].addThing(thing); 

我得到一個NullPointerException錯誤,任何想法,爲什麼?

+1

不相關,但嘗試命名您的類(和接口)與領先的大寫字母和您的變量與領先的小寫。會使代碼像「someThings s = someThings;」更具可讀性。 – sbk 2013-02-14 17:08:53

+0

哎呀抱歉,應該是 public addThing(someThings sT)someThings s = sT; this.lst.add(s); } – codeoverflow 2013-02-14 17:17:44

回答

3

不幸的是你不能使用增強的for-each使用數組循環,當你想變異他們。你的例子中的lst2只是另一個參考(對null),修改它不會修改原始數組。試試這個:

for(int i = 0; i < field.length; ++i) 
    for(int j = 0; j < field[i].length; ++j) 
     field[i][j] = new someThingsList(); 

或者:

for(int i = 0; i < h; ++i) 
    for(int j = 0; j < w; ++j) 
     x.field[i][j] = new someThingsList(); 

由於事實上,這個問題是不特定的陣列。請檢查下面的代碼:

List<String> strings = //... 

for(String s: strings) { 
    s += "Bar"; 
} 

即使它看起來好像你修改原始strings列表中,則幾乎沒有對矯正臨時s變量被重建和每個循環後忽略。

+0

下的「x.field [I]。長度」是紅色: 表達式的類型必須是數組類型,但它解析爲int – codeoverflow 2013-02-14 17:12:11

+0

@codeoverflow:剛剛檢查過一個編譯器,它適用於我。也許問題在別處? 「x.field」下的 – 2013-02-14 17:20:26

+0

。長度[我]「我的意思,對不起,當我改變它」x.field.length「它的工作,嗯.. – codeoverflow 2013-02-14 17:23:29

0

你實例化數組x.field = new someThingsList[h][w];但你沒有實例someThingsList對象。所以x.field [i] [j]給出NullPointerException

for(int i = 0; i < x.field.length; i++) 
    for(int j = 0; j < x.field[i].length; j++) 
     x.field[i][j] = new someThingsList(); 
+0

下的「x.field [I]。長度」是紅色:類型表達的必須是一個數組類型,但它解決了爲int – codeoverflow 2013-02-14 17:12:31

0

與您的代碼的問題是,當你通過第二爲每個被實例化「LST2」,這是一個局部變量的循環,這樣就不會影響原數組的價值循環迭代。只要循環結束,lst2的值就會丟失。因此,您的數組元素保持爲空,並且當您嘗試調用空對象上的方法時,它會給出空指針異常。

要理解這個嘗試打印arr [0]。它將打印一個對象類型,然後嘗試打印將打印爲空的[0] [0]。

希望這會清除爲什麼你的語法不起作用。

試着運行這段代碼,你會明白這裏出了什麼問題。

import java.util.*; 
class someThingsList { 

    private List<String> lst; 

    public someThingsList() { 
     this.lst = new ArrayList<String>(); 
    } 
    public void addThing(String someThings) { 
     String s = someThings; 
     this.lst.add(s); 
    } 
} 
class Main{ 

    private static someThingsList[][] field; 

public static void main (String[] args) throws java.lang.Exception 
    { 
    new Main(3,3); 
System.out.println(Main.field[0]); 
System.out.println(Main.field[0][0]); 
    Main.field[0][0].addThing("thing"); 
    } 

    public Main(int h, int w) { 
    Main.field = new someThingsList[h][w]; 
    for (someThingsList[] lst1 : Main.field) 
    { 
    System.out.println(lst1); 
     for (someThingsList lst2 : lst1){ 
System.out.println(lst2); 
      lst2 = new someThingsList(); 
System.out.println(lst2);} 
    } 
    } 
}