Java JRE在不应提供NullPointerException时提供NullPointerException

Java JRE在不应提供NullPointerException时提供NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我的代码是 public class Test { public class Struct { public int id; } Struct s[] = new Struct[10]; public Test() { s[0].id = 0; } public static void main(String[] args) { Test t = new Test(); } } 它在s[0]

我的代码是

public class Test {
    public class Struct {
        public int id;
    }
    Struct s[] = new Struct[10];
    public Test() {
        s[0].id = 0;
    }
    public static void main(String[] args) {
        Test t = new Test();
    }
}
它在s[0]行中给出了一个错误。id=0;
但是,s已初始化,因此我无法理解它为什么会出现错误。

您已初始化
s
,但还必须初始化
s[0]

    s[0] = new Struct();
    s[0].id = 0;
创建数组时,其所有元素都设置为。对于引用类型(如此处),默认值为
null
,因此
s[0]
将保持
null
,直到为其分配了某些内容


这个规则的例外当然是在创建多维数组时:当您编写
新类型[N][M]
时,将为您创建长度为M的中间N个数组,尽管它们的内容也将设置为元素类型的默认值。

您正在创建并初始化一个新的数组对象,但是该数组对象也必须初始化自己的对象,因为默认情况下它们是空的

s[0] = new Struct();
s[0].id = 0;

将解决您的问题。

您初始化了数组,但没有初始化数组中的引用,因此在使用之前必须初始化它们

s[0] = new Struct();
s[0]没有指向任何东西,你必须先给它一个它要引用的东西(对象)。因此,要在数组中使用任何引用,您必须初始化整个数组:

for(i=0;i<=9;i++){
s[i] = new Struct();
}
for(i=0;i让我们看看它是如何工作的

在main方法中创建测试对象时,让我们看看会发生什么

您的Test()构造函数将被调用,您将在其中执行以下操作

“s[0]。id=0”

但是,嘿,等等..你的结构数组s[]不是还有空值吗

PS:请注意,当您创建对象数组时,它是用空值初始化的。 与创建int数组int[]时一样,数组的所有元素都使用默认值(即零)初始化,与创建对象[]时类似,默认情况下,所有元素都使用空值初始化。


因此,基本上您正在设置s[0]的id属性,该属性为null,因此JRE会引发NullPointerException

当然它会引发
NullPointException
伙计,尝试初始化
s[0]
如下
s[0]=new Struct();s[0].id=10;
:)