在我的程序中,我有一个名为Hive的类,它包含Honey,Pollen,royalJelly和几种蜜蜂的arraylist。一些蜜蜂类型有一种吃法,它们之间几乎完全相同,不同之处在于它们吃什么或吃多少。每只蜜蜂都有另一个方法,它在蜜蜂上调用eat方法,在thehive的另一个方法中,它循环通过arraylist调用每个蜜蜂另一个日。我的女王蜜蜂吃得很好然而,当我对我的工人,无人机或幼虫吃饭时,我得到一个NullPointerException并且我无法找出原因!我的代码:
Hive课程:
public class Hive {
ArrayList<Bee> cells = new ArrayList<Bee>();
int honey = 10;
int royalJelly = 10;
int pollen = 10; //some methods omitted
public void anotherDay(){
ArrayList<Bee> dead = new ArrayList<Bee>();
int size = cells.size();
for(int i = 0; i < size; i++) {
Bee bee = cells.get(i);
if ((bee = bee.anotherDay()) == null) {
dead.add(cells.get(i));
} else {
cells.set(i, bee);
}
}
cells.removeAll(dead);
}
Queen Class :(不要从这个类中的eat方法获取空指针异常)
public class Queen extends Bee{
Hive hive = null;
public Queen(){
}
public Queen(Hive hive){
this.hive = hive;
this.type = 1;
this.age = 11;
this.health = 3;
}
public Bee anotherDay(){
eat();
if (health == 0) {
return null;
}
age++;
if (age % 3 == 2) {
hive.addBee(new Egg());
}
return this;
}
public boolean eat(){
if(hive.honey >= 2) {
hive.takeHoney(2);
if(health < 3){
health++;
}
return true;
}
health -= 1;
return false;
}
}
工蜂类:(得到NullPointerException-不知道为什么)
public class Worker extends Bee {
Hive hive = null;
public Worker(){
this.type = 2;
this.age=11;
this.health=3;
}
public Bee anotherDay(){
eat();
age++;
if (health == 0) {
return null;
}
return this;
}
public boolean eat(){
if(hive.honey >= 1) {
hive.takeHoney(1);
if(health < 3){
health++;
}
return true;
}
health -= 1;
return false;
}
}
例外:
Exception in thread "main" java.lang.NullPointerException
at Larvae.eat(Larvae.java:26)
at Larvae.anotherDay(Larvae.java:13)
at Hive.anotherDay(Hive.java:86)
at TestBasicHive.testpart4(TestBasicHive.java:381)
at TestBasicHive.main(TestBasicHive.java:13)
我将元素添加到arraylist并且代码运行良好,直到幼虫/工人或无人机出现并尝试使用eat方法。如果我注释掉运行eat方法的位,它会运行正常(但显然不能按照我的意愿去做)
根据给出的答案,我尝试将我的worker类中的构造函数更改为:
public Worker(Hive hive){
this.hive=hive;
this.type = 2;
this.age=11;
this.health=3;
}
public Worker(){}
我需要'empty'构造函数,因为工蜂从pupa中的anotherDay方法添加到hive中,这是:
public Bee anotherDay(){
age++;
if(age>10){
return new Worker();
}return this;
}
然后通过hive中的anotherDay方法将其添加到arraylist中。
答案 0 :(得分:3)
hive
已初始化为null
,且您的Worker
课程从未更改过。然后在eat
方法中尝试访问字段。