2

我的代码是

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 已初始化,所以我不明白为什么它会出错。

4

4 回答 4

8

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

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

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

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

于 2013-07-14T20:26:52.810 回答
3

您正在创建和初始化一个新的数组对象,但该数组对象必须也初始化其自己的对象,因为它们默认为空。

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

会解决你的问题。

于 2013-07-14T20:27:06.157 回答
1

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

s[0] = new Struct();

s[0] 没有任何内容,您必须首先给它一个它要引用的 Thing(Object)。因此,要在数组中使用任何引用,您必须初始化整个数组:

for(i=0;i<=9;i++){
s[i] = new Struct();
}
于 2013-07-14T20:27:32.220 回答
0

让我们看看它是如何工作的,

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

你的 Test() 构造函数将被调用,在其中你正在做

“s[0].id = 0”

但是嘿等等..你不是 Struct 数组 s[] 仍然有空值吗?

PS:请注意,当您创建一个对象数组时,它是用空值初始化的。就像当你创建一个 int 数组 int[] 时,数组的所有元素都用默认值(即零)初始化,类似地,当你创建一个 object[] 时,所有元素都默认用 null 值初始化。

所以基本上你设置 s[0] 的 id 属性为空,因此 JRE 抛出 NullPointerException

于 2013-07-14T20:48:19.813 回答