我有一个具有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错误,知道为什么?
答案 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);}
}
}
}