我的NullPointerException的原因是什么?

时间:2013-12-08 19:28:28

标签: java exception arraylist nullpointerexception

在我的程序中,我有一个名为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中。

1 个答案:

答案 0 :(得分:3)

hive已初始化为null,且您的Worker课程从未更改过。然后在eat方法中尝试访问字段。