我的代码是
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被初始化了,所以我无法理解它为什么会出错。
答案 0 :(得分:8)
您已初始化s
,但您还必须初始化s[0]
。
s[0] = new Struct();
s[0].id = 0;
创建数组时,其所有元素都设置为the default value of the element type。对于引用类型(如此处),默认值为null
,因此s[0]
会保留null
,直到为其分配内容为止。
此规则的例外当然是在创建多维数组时:当您编写new type[N][M]
时,将为您创建长度为M的中间N个数组,尽管它们的内容也将设置为元素类型的默认值。
答案 1 :(得分:3)
您正在创建并初始化一个新的数组对象,但该数组对象必须也有自己的对象也已初始化,因为它们默认为null。
s[0] = new Struct();
s[0].id = 0;
将解决您的问题。
答案 2 :(得分:1)
您初始化了数组,但未初始化数组,因此您必须在使用之前初始化它们。
s[0] = new Struct();
s [0] s指出什么都没有,你必须首先给它一个它将要引用的东西(对象)。因此,对于在数组中使用任何引用,您也初始化整个数组:
for(i=0;i<=9;i++){
s[i] = new Struct();
}
答案 3 :(得分:0)
让我们看看它是如何运作的,
当你在main方法中创建Test对象时,让我们看看会发生什么,
你将在其中调用Test()构造函数
&#34; s [0] .id = 0&#34;
但是嘿等等..不是你的结构数组s []仍然有空值吗?
PS:请注意,在创建对象数组时,会使用空值初始化它。 就像创建int数组int []时一样,数组的所有元素都使用默认值初始化(即Zero&#39; s),当你创建一个object []时,所有元素默认都是用null值初始化的。 /强>
所以基本上你要设置s [0]的id属性为null,因此JRE抛出NullPointerException