变量启动时出现NullPointerException

时间:2014-02-20 16:39:12

标签: java nullpointerexception

我有这段代码:

public class loops {

    public static void main(String[] args) {
        person[] people = new person[5];
        int i = 0;
//        for (person p : people) {
//            p.age = i++;
//        }
        for (int j = 0; j < people.length; j++) {
            people[i].age = i++;
        }

        for (person p : people) {
            System.out.print(p.age);
        }
    }
}

class person {

    public int age;
}

我尝试了两个循环,但结果是永远的空指针异常。

为什么?

例外行是:

            people[i].age = i++;

            p.age = i++;

6 个答案:

答案 0 :(得分:2)

你刚刚创建了一个person数组,你没有实例化任何项目,它们都指向null,你需要这样做:

people[i] = new person();
你的循环中的

所以你的循环将是:

for (int j = 0; j < people.length; j++) {
            people[i] = new person();
            people[i].age = i++;
        }

答案 1 :(得分:2)

虽然你没有明确告诉我们在哪里,但我猜你的第一个for循环中的程序正在崩溃:

people[i].age = i++;

请记住,仅仅是因为你这样做了:

person[] people = new person[5];

并不意味着您拥有一组person个对象。它只创建一个可以包含person个对象的数组,但仍然需要创建这些对象

修改

请记住类的Java命名约定;它们应以大写字母开头(public class Loopsclass Person)。否则,有时很难知道是在类或实例化对象上调用方法。

答案 2 :(得分:1)

在使用之前,您必须在数组的每个位置手动实例化一个新对象,默认情况下,除非显式初始化,否则对象数组中的所有位置都是null

people[0] = new person();
people[1] = new person();
// and so on

更简单,使用循环:

for (int i = 0; i < people.length; i++)
    people[i] = new person();

我们可以使用相同的循环在一个步骤中初始化人员及其年龄,我们也可以使用相同的索引 - 不需要同时拥有ij:< / p>

for (int i = 0; i < people.length; i++) {
    people[i] = new person();
    people[i].age = i;
}

另请注意,按照惯例,您的person课程应该被称为Person

答案 3 :(得分:1)

实际上

new person[5]

不会实例化类型为person的5个对象,而只会为类型为person的对象添加5个占位符的数组。

答案 4 :(得分:0)

您尚未初次化人员。

person[] people = new person[5];

使所有指向null。

答案 5 :(得分:0)

您初始化了一系列人,但没有任何人。

尝试:

for (int i = 0; i < 5; i++) {
   People p = new People();
   p.age = 4;
   people[i] = p;
}