2

我有一个具有 ArrayList 属性的类,以及另一个具有该类的二维数组的类:

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 错误,知道为什么吗?

4

3 回答 3

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在每次循环后重新创建并忽略的临时变量。

于 2013-02-14T17:05:24.157 回答
0

您已经实例化了数组x.field = new someThingsList[h][w];,但没有实例化someThingsListObject。所以 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();
于 2013-02-14T17:05:22.843 回答
0

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

要理解这一点,请尝试打印 arr[0]。它将打印一个对象类型,然后尝试打印 a[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);}
    }
    }
}
于 2013-02-14T17:38:00.660 回答