2D ArrayLists数组null异常

时间:2013-02-14 17:01:35

标签: java arraylist multidimensional-array

我有一个具有ArrayList属性的类,以及另一个具有该类的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();
}

当我有一个新的x对象(2,2)为h和w时,尝试做

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

我收到NullPointerException错误,知道为什么?

3 个答案:

答案 0 :(得分: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变量,并在每次循环后忽略它。

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

答案 2 :(得分:0)

你的代码的问题是当你为每个循环迭代第二个时,你实例化了“lst2”的值,它是循环的局部变量,因此它不会影响你的原始数组。一旦你的循环结束,lst2的值就会丢失。这样你的数组元素保持为null,当你尝试在null对象上调用一个方法时,它会给出空指针异常。

要理解这一点,请尝试打印arr [0]。它将打印一个对象类型,然后尝试打印[0] [0],它将打印null。

希望这可以解释为什么你的语法不起作用。

尝试运行此代码,您将了解此处出现的问题。

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