JRE在不应该的情况下给出NullPointerException

时间:2013-07-14 20:25:04

标签: 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]中给出错误.id = 0; 但是s被初始化了,所以我无法理解它为什么会出错。

4 个答案:

答案 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