这个nullPointerException的原因是什么?

时间:2013-12-11 01:56:30

标签: java arraylist nullpointerexception singleton

当我运行我的测试工具时,我在行上得到NullPointerException:

if(flower.extractPollen(pol)){

我正在努力解释。在我的测试工具中,我正在为我的花园实例添加鲜花,据我所知,花朵上有花粉。在我的测试工具中,我正在创建一个花园的实例,蜂巢中的蜂王(在arraylist中),并在花园中添加玫瑰和水仙花(在arraylist中)。然后我又在蜂房和花园里跑了一天,在花园里的鲜花上运行另一天(给花朵添加花粉,我可以告诉它是从印花中发生的)并创造出更多的蜜蜂。当创建一个工蜂时,应该从花园的实例中获取一朵花并从中提取花粉,但我得到一个NullPointerException。相关代码:

public class Worker{

    public Bee anotherDay(){
        for(int u = 0; u< 2; u++){
            Flower flower = Garden.getInstance().findFlower();
            for(int pol = 5; pol>0; pol--){
                if(flower.extractPollen(pol)){
                    if(pol>1){
                        hive.addRoyalJelly(1);
                        pol = pol - 2;
                        hive.addHoney(pol);
                    }
                    break;
                }
            }//code omitted which returns the bee in this method and some other methods from the class
        } 
    }

public class Garden{
    private ArrayList<Flower> flowerbed = new ArrayList<Flower>();
    Hive hive = null;

    private static Garden instance;

    private Garden(){}

    public static Garden getInstance(){
        if(instance == null){
            instance = new Garden();
        }
        return instance;
    }

    public void anotherDay(){
        int size = flowerbed.size();

        for(int i = 0; i < size; i++) {
            Flower flower = flowerbed.get(i);
            System.out.println(flower);
            flower.grow();
        }
    } 

    public Flower getFlower(int fi){
        if(fi < flowerbed.size()){
            return flowerbed.get(fi);
        }else{
            return null;
        }
    }

    public Integer getRandomInteger(Integer max)
    {
        Random rand = new Random();
        int number;
        number = rand.nextInt(max) + 1;
        return new Integer(number);
    }   

    public Flower findFlower(){
        return getFlower(getRandomInteger(flowerbed.size()));
    }
}

public abstract class Flower{

    public boolean extractPollen(int po){
        if(po <= pollen){
            pollen= pollen - po;
            return true;
        }return false;
    }

    //subclasses are not abstract and in their grow methods pollen is added. Some other methods omitted
}

通过在我的代码周围使用System.out.println(),我可以看到我使用的代码是将一个玫瑰和adoffodil添加到花园的实例中,并在创建工蜂时(第14天)他们分别有28和42个花粉。由于工人只是试图提取5我不明白为什么我得到这个例外!堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
at Worker.anotherDay(Worker.java:21)
at Hive.anotherDay(Hive.java:105)
at TestBasicHive.testpart5(TestBasicHive.java:405)
at TestBasicHive.main(TestBasicHive.java:14)

4 个答案:

答案 0 :(得分:3)

我猜你的getFlower方法返回null,因为fi大于flowerbed.size();而不是在那里返回null,抛出一个异常,看看会发生什么。出于这个原因,抛出异常通常优先于返回null。

答案 1 :(得分:1)

您是否定义了findFlower方法?我没有看到任何代码。这可能有助于显示空指针的位置。

您的rand.nextInt(max) + 1应该只是rand.nextInt(max)。通过添加1,数字可能等于Flower数组的大小,并且在getFlower(fi)方法中,如果 fi&gt; = ,则返回null花阵。

答案 2 :(得分:1)

评论会更合适,但这是一种声誉......

你的NullPointerException是因为“flower”为null。我没有在你的Garden类中看到findFlower方法的实现,但它可能找不到你要求的花......

...我看到你添加了findFlower方法的实现......

检查随机整数生成器并确保它只返回有效数组索引的值。您还应该更改调用findFlower的代码以正确处理null返回,因为这可以作为findFlower方法中的可能结果实现。

答案 3 :(得分:0)

NullPointerExceptions是当您尝试使用指向内存中没有位置的引用(null)并通过执行以下条件时发生的异常,

如果(flower.extractPollen(POL)){

这里你得到空指针异常因为花变量用null引用而没有做空指针检查,你试图调用extractPollen(pol)方法。所以在你做其他东西之前对任何对象变量进行空检查