我的代码存在问题。
首先,这是我的代码。
public class Zoo {
public int j=0;
public Animal[] park;
// Exercise 9
public Zoo() {
Animal[] park = new Animal[10];
}
// Exercise 10
public void addAnimal(Animal first) {
for (int i = 0; i < 10; i++) {
if (park[i] != null) {
park[i] = first;
i=j;
i = 10;
} else if (i == 9) {
System.out.println("The zoo is full!");
}
}
}
// Exercise 11
public void feed() {
for (int i = 0; i < 10; i++) {
park[i].mass *= 1.1;
}
}
public String toString() {
String result = "The list:\n";
for (int i = 0; i< 10; i++) {
result = result + "cage " + i + " status:" + park[i] + "\n";
}
return result;
}
public void print() {
System.out.println(park.toString());
}
public int totalLegs() {
int totalLeg = 0;
for (int i = 0; i < 10; i++) {
totalLeg += park[i].legs;
}
return totalLeg;
}
}
ALSO
public class Animal {
float mass;
String name;
int legs;
// Exercise 6-6
public Animal(String randomName) {
name = randomName;
legs = 0;
mass = 0;
}
// Exercise 6-7
public Animal(float one, String two, int three) {
mass = one;
name = two;
legs = three;
}
//Exercise 7
public String toString(){
return "name =" + name + "legs=" + legs + "mass=" + mass;
}
public void massSetter() {
}
public String getName() {
return name;
}
public int getLegs() {
return legs;
}
}
和
public class TestZoo {
public static void main(String[] args){
Zoo zoo = new Zoo();
Animal elephant = new Animal(300f,"elephant",4);
Animal spider = new Animal(0.5f,"spider",6);
Animal snake = new Animal(10f,"snake",0);
zoo.addAnimal(elephant);
zoo.addAnimal(spider);
zoo.addAnimal(snake);
zoo.print();
System.out.println("Average number of legs is");
}
}
正如您可能从代码中可以看出的那样,我对编程非常陌生,当我运行最后一个类(TestZoo.java)时,它会给我以下错误。
Exception in thread "main" java.lang.NullPointerException
at Zoo.addAnimal(Zoo.java:13)
at TestZoo.main(TestZoo.java:9)
我做了一些搜索,显然当我尝试传递null时,我得到了这个错误,好像它有一些东西。
我查看了Zoo类的第13行,我诚实地不知道如何解决这个问题。
非常感谢任何帮助。
提前致谢
答案 0 :(得分:6)
这是问题所在:
public Animal[] park;
public Zoo() {
Animal[] park = new Animal[10];
}
您正在声明一个名为park
的实例变量 - 但是在构造函数中,您不是为该实例变量赋值,而是创建一个 local < / em>变量名为park
并为其赋值。将构造函数更改为:
public Zoo() {
park = new Animal[10];
}
或者您可以将声明更改为:
public Animal[] park = new Animal[10];
并完全删除显式构造函数声明。
无论哪种方式,当您致电park
时,实例变量addAnimal
都将为非空。
此外,在addAnimal
内,存在各种问题。首先,您要继续查看park
,直到找到非null 条目,而不是直到找到空条目...这是错误的方式。
我还会对代码进行各种其他更改(例如保持字段为私有),但希望这足以让您前进。
答案 1 :(得分:1)
在构造函数中
public Zoo() {
Animal[] park = new Animal[10];
}
你有shadowed park,因此实例变量park永远不会被初始化
这意味着你创建了另一个变量park,它恰好与类变量同名
public class Zoo {
public int j=0;
public Animal[] park; <--This park
public Zoo() {
Animal[] park = new Animal[10]; <--In not the same as this park
}
要纠正,只需在构造函数中停止创建新公园即可,
public class Zoo {
public int j=0;
public Animal[] park; <--This park
public Zoo() {
park = new Animal[10]; <--Now is the same as the other park
}