Java NullPointerException错误,生成用户定义类的数组并初始化它

Java NullPointerException错误,生成用户定义类的数组并初始化它,java,arrays,nullpointerexception,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

在下面的代码中,有人能说出错误吗

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行给出了以下错误:

线程主java.lang.NullPointerException中出现异常 在Enter.mainSorAccToAge.java:13中,java中的对象类型默认为空。对象数组中的元素没有什么不同。确保数组元素在为其字段赋值之前已初始化

for (int i=0; i < p.size(); i++) {
  p[i] = new Person();
}
将只使用空值初始化数组,因此必须使用以下值初始化项:

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()
};

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

所以你可以用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;

创建对象数组时,数组中的每个对象都不会初始化。 单个元素将如下所示:

Person example;
显然,示例尚未初始化,所以指针为null,并且没有构造任何对象。要解决此问题,只需初始化p[0],如下所示:

p[0] = new Person();

公共静态无效字符串[]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.

}

主要问题是数组已初始化,但数组中的元素尚未初始化

如果将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。而且没有setter,所以您甚至不能执行p[0].setNameabc

每个记录必须按如下方式初始化:

p[0] = new Person(67, "abc");
虽然如果在未初始化的数组元素上执行p[0],仍然会得到NPE

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

Person p[] = new Person[5];
上面的语句使用空值创建p[]数组

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

p[0]=new Person();

像这样,您需要在使用

之前初始化数组。我建议不要使用这种样式,这是糟糕的OOP。离题:我建议使用setter方法来分配值,即
p[0]=new Person();