Java ArrayList的2D数组空异常

Java ArrayList的2D数组空异常,java,arraylist,multidimensional-array,Java,Arraylist,Multidimensional Array,我有一个类具有ArrayList属性,另一个类具有该类的2D数组: public class someThingsList { private List<someThings> lst; public someThingsList () { this.lst = new ArrayList<someThings>(); } public addThing(someThings) { someThings

我有一个类具有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);
    }
}
例如,当我有一个新的x对象,它的(2,2)是h和w,试着

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

我得到一个NullPointerException错误,知道为什么吗?

您已经实例化了数组
x.field=newsomethingslist[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();
for(int i=0;i
不幸的是,当您想要对数组进行变异时,不能对数组的每个循环使用增强型<示例中的code>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
或者:

for(int i = 0; i < h; ++i)
    for(int j = 0; j < w; ++j)
        x.field[i][j] = new someThingsList();
for(int i=0;i
事实上,这个问题并不是特定于阵列的。检查以下代码:

List<String> strings = //...

for(String s: strings) {
    s += "Bar";
}
列出字符串=/。。。
用于(字符串s:字符串){
s+=“巴”;
}

即使看起来您正在修改原始的
字符串
列表,您也几乎没有修改在每个循环后重新创建并忽略的临时
s
变量。

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

要了解这一点,请尝试打印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);}
    }
    }
}
import java.util.*;
分类一些东西{
私人名单;
公共物品清单(){
this.lst=新的ArrayList();
}
公共void addThing(字符串something){
字符串s=某物;
本条第一款增补;
}
}
班长{
私有静态someThingsList[][]字段;
公共静态void main(字符串[]args)引发java.lang.Exception
{
新干线(3,3);
System.out.println(主字段[0]);
System.out.println(主字段[0][0]);
Main.field[0][0].addThing(“thing”);
}
公用干管(内部h、内部w){
Main.field=新事物列表[h][w];
for(someThingsList[]lst1:Main.field)
{
系统输出打印项次(lst1);
对于(某物列表lst2:lst1){
系统输出打印项次(lst2);
lst2=新事物列表();
System.out.println(lst2);}
}
}
}

不相关,但请尝试使用大写前导字母命名类(和接口),使用小写前导字母命名变量。将使代码像
someThings s=someThings可读性好得多。抱歉,这应该是public addThing(someThings sT){someThings s=sT;this.lst.add(s);}在“x.field[i].length”下的红色,带有:表达式的类型必须是数组类型,但解析为int@codeoverflow:刚刚通过编译器检查,它对我有效。也许问题出在其他地方?在“x.field.length[i]”下,我的意思是,对不起,当我把它改为“x.field.length”时,它起作用了,嗯……现在起作用了;)我用的是“x.field.length[i]”而不是你写的,非常感谢!在“x.field[i].length”下,红色带:表达式的类型必须是数组类型,但解析为int
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);}
    }
    }
}