我有这段代码:
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++;
答案 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 Loops
和class 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();
我们可以使用相同的循环在一个步骤中初始化人员及其年龄,我们也可以使用相同的索引 - 不需要同时拥有i
和j
:< / 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;
}