2013-12-11 194 views
0

當我運行我的測試工具,我上線得到一個NullPointerException異常:這個nullPointerException的原因是什麼?

if(flower.extractPollen(pol)){ 

一種我竭力解釋。在我的測試工具中,我正在爲花園的實例添加鮮花,並且根據println的說明,花朵上有花粉。在我的測試工具中,我創建了一個花園實例,一個蜂羣中的蜂王(在一個數組列表中),並在花園中添加了一朵玫瑰和一個水仙花(在一個數組列表中)。然後,我又花了一天的時間在蜂房和花園裏花了一天的時間在花園裏的花朵上(我可以告訴他們添加花粉是從println發生的)並創造更多的蜜蜂。當工蜂被創建時,它應該從花園的實例中獲取一朵花,並從中提取花粉,但是我得到一個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) 
+0

你能向我們展示空指針異常的堆棧跟蹤嗎? – Kyle

+0

加入findFlower方法代碼,並且將添加堆棧跟蹤 – user2973447

+2

'rand.nextInt(max)+ 1' - 爲什麼'+ 1'? –

回答

3

我猜你的getFlower方法返回null,因爲fi大於flowerbed.size();而不是在那裏返回null,拋出一個異常,看看會發生什麼。出於這個原因,拋出異常通常優先於返回null。

1

您是否定義了一個findFlower方法?我沒有看到任何代碼。這可能有助於顯示空指針的位置。

您的rand.nextInt(max) + 1應簡單地爲rand.nextInt(max)。通過加1,可能該數字等於Flower數組的大小,並且在您的getFlower(fi)方法中,如果fi> =返回null Flower數組的大小。

1

註釋會更合適,但它是一個信譽的事情...

你NullPointerException異常是因爲「花」爲空。我沒有看到花園類的findFlower方法的實現,但它可能沒有找到你要求的花...

...我看到你添加了findFlower方法的實現...

檢查您的隨機整數生成器,並確保它只返回有效數組索引的值。您還應該更改調用findFlower的代碼以正確處理空返回,因爲這是作爲findFlower方法中可能的結果實現的。

0

NullPointerExceptions的是,當您嘗試使用一個指向內存中(空)沒有位置,並通過您的條件之下會參考發生的異常,

如果(flower.extractPollen(POL)){

這裏你得到了空指針異常,因爲花變量被引用爲空,並且沒有執行空指針檢查,所以你試圖調用extractPollen(pol)方法。所以,在做其他一些事情之前,先對任何對象變量進行空檢查。

相關問題