2011-12-15 7 views
0
package survival; 

public class World { 
    private int width; 
    private int height; 

    private int distancePenalty = 2; 
    private int turnPenalty = 4; 
    private double hungerPenalty = 0.1; 

    private Plant[] plants; 
    private Herbivore[] herbivores; 
    private Carnivore[] carnivores; 

    private int[] newestHerbivore; 
    private int[] newestCarnivore; 

    public World(int plantNumber, int herbivoreNumber, int carnivoreNumber, int width, int height) { 
     this.width = width; 
     this.height = height; 

     plants = new Plant[plantNumber]; 
     for (int i = 0; i < plantNumber; i++) { 
      plants[i] = new Plant(Math.random() * width, Math.random() * height); 
     }   
     herbivores = new Herbivore[herbivoreNumber]; 
     for (int i = 0; i < herbivoreNumber; i++) { 
      herbivores[i] = new Herbivore(Math.random() * width, Math.random() * height); 

      //////////// This line causes java.lang.NullPointerException 
      newestHerbivore[i] = 1; 
     } 
     carnivores = new Carnivore[carnivoreNumber]; 
     for (int i = 0; i < carnivoreNumber; i++) { 

      //////////// This line causes java.lang.NullPointerException 
      newestCarnivore[i] = 1; 
     }   
    } 
} 

に項目を追加する際に、なぜこの行は次のとおりです。Javaの例外アレイ

newestHerbivore[i] = 1; 

例外を発生させた要素?

+0

newestHerbivore配列は非常にそれがライン15 –

+0

をスローします割り当てる、空である:それは、宣言が、初期化されていませんので、それは 'null'なのでが含まれています。 –

答えて

4

あなたは、あなたがそれに割り当てる前に、配列を初期化する必要があります。

ところで
herbivores = new Herbivore[herbivoreNumber]; 
newestHerbivore = new int[herbivoreNumber]; 

:配列が面倒で柔軟性がありません。 Javaでは、代わりにコレクションを使用する必要があります。ほとんどの場合、ArrayListsは配列コードの代わりに問題なく動作します。

+0

あなたはあなたが言ったことを使うためにどのように変更しますか? –

+0

@ConnerRuhl [コレクションチュートリアル](http://docs.oracle.com/javase/tutorial/collections/)を読んでください。 –

2

newestHerbivoreの配列を初期化することはありません。その要素に割り当てようとすると、NPEがトリガーされます。

newestCarnivoreと同じです。

私はあなたの質問に次の文言は混乱を説明するかもしれないと思う:なぜ要素を追加して...あなたがではありません要素を追加し、既存の要素の値を変更です。あなたのケースでは、配列参照がnullであるため、要素は存在しません(本質的に、配列全体は存在しません)。

この2つの配列の正確な目的は明確ではないので、私はこれを修正する方法を提案することを躊躇します。私の推測 - 2つの変数の名前とコメントに基づいて - 実際には配列ではなくスカラ変数でなければならないでしょう。

+0

の底部近くにエラー –

+0

@ConnerRuhl上で宣言されたインデックスに基づいて値がコード – NPE

+0

@ConnerRuhlは宣言されていますが、初期化されていません –