2013-02-14 117 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);} 
    } 
    } 
}