使用用户定义的类数组并初始化它时出现Java NullPointerException错误

时间:2013-08-19 11:52:13

标签: java arrays nullpointerexception

在下面的代码中,任何人都可以告诉错误吗?

public class Person {
    int age;
    String name;
}

public class Enter {

    public static void main(String[] args) {

        Enter ob = new Enter();
        Person p[] = new Person[5];

        p[0].name = "abc"; //Line 13
        p[0].age = 67;
            //I have initialized the whole array likewise.
    }
}

但是在第13行中它出现以下错误:

线程“main”java.lang.NullPointerException中的异常   在Enter.main(SorAccToAge.java:13)

7 个答案:

答案 0 :(得分:5)

Java中默认

Object类型为null。 Object数组中的元素也不例外。确保在为其字段分配值之前初始化数组元素

for (int i=0; i < p.size(); i++) {
  p[i] = new Person();
}

答案 1 :(得分:0)

Person p[] = new Person[5];

将简单地初始化一个具有空值的数组,因此您必须使用以下内容初始化项目:

Person p[] = new Person[5];

    p[0] = new Person();
    p[1] = new Person();

依此类推,或在一条指令中

Person p[] = new Person[5] = {
  new Person(),new Person(),new Person(),new Person(),new Person()
};

答案 2 :(得分:0)

您忘记初始化该数组中的任何对象。

所以你可以使用for循环来做到这一点,

Person p[] = new Person[5];
for(int i=0; i<p.size(); i++){
  p[i] = new Person();
}

p[0].name = "abc"; //Line 13
p[0].age = 67;

p[1].name = "xyz"; //Line 13
p[1].age = 68;

答案 3 :(得分:0)

创建对象数组时,不会初始化数组中的每个对象。 单个元素看起来像这样:

Person example;

显然,“example”尚未初始化,因此指针为null,并且没有构造任何对象。要解决这个问题,只需像这样初始化p [0]:

p[0] = new Person();

答案 4 :(得分:0)

public static void main(String [] args){

    Enter ob = new Enter();
    Person p[] = new Person[5];
    for(int i=0;i<5;i++){
       p[i] = new Person();
    }
    p[0].name = "abc"; //Line 13
    p[0].age = 67;
            //I have initialized the whole array likewise.

}

答案 5 :(得分:0)

主要问题是您的数组已初始化但数组中的元素没有。

如果您使Person类不可变,那么您将更加清楚:

public final class Person {
    private final int age;
    private final String name;

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }
}

现在您将看到您甚至无法拨打p[0].name = "abc"。而且没有制定者,所以你甚至不能做p[0].setName("abc")

每条记录都必须像这样初始化:

p[0] = new Person(67, "abc");

虽然如果对未初始化的数组元素执行p[0].getName(),仍会获得NPE。

总而言之,您必须在创建数组后初始化数组的每个元素。

答案 6 :(得分:0)

Person p[] = new Person[5];

上面的语句创建具有空值的p []数组

所以在使用p的实例化之前,比如

p[0]=new Person();

像这样你需要在使用

之前初始化数组