2011-01-08 9 views
9

私はJavaを使用し始めていると私は犬のクラスオブジェクトの配列を作成しようとしていると私はこのエラーを取得しています:この行でのjava.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerException

Dog[] dogsList = new Dog[7]; 
dogsList[4].setSize(4); 

答えて

24

アレイを作成すると、それは参照の配列だ - 彼らはどんなインスタンスDogに言及していないように、すべてのこれらの参照は、nullで最初にと。

また
Dog[] dogsList = new Dog[7]; 
dogsList[4] = new Dog(); 
dogsList[4].setSize(4); 

、すでに他の場所からDogへの参照を持っている可能性があります:あなたはこのように、インスタンスを作成する必要が

Dog fido = new Dog(); 
// Other code here 

dogsList[4] = fido; 
dogsList[4].setSize(4); 

少し背景

の一つ理解すべき最も重要なことは、オブジェクト参照の違いです。参照はオブジェクトに到達する方法であり、複数の参照は同じオブジェクトを参照することができます。例:ここでは

Dog x = new Dog(); 
Dog y = x; 

x.setName("Fido"); 
System.out.println(x.getName()); // Will print "Fido" 

xy変数の値は、彼らが(私は分で上に来るかnull、)犬にの参照をだ...犬ではありません。ライン

Dog y = x; 

xの値にyの初期値を設定する - ので、2つの変数が同じDogオブジェクトを参照します。

ここでnullは、のいずれかのオブジェクトを参照しない特別な参照値です。 逆参照をnull参照(通常は.演算子を使用しますが、配列インデックスなどの場合もあります)しようとすると、NullPointerExceptionがスローされます。

配列

アレイを作成は、すべての要素がすぐに型のデフォルト値が移入されています。数値タイプが0の場合はboolean、それはfalse、charの場合は0です。参照タイプの場合は(クラス)はnull参照です。だから、あなたがこれを行うと:と同等です

Dog[] dogsList = new Dog[7]; 

:あなたの元のコードでそう

Dog[] dogsList = { null, null, null, null, null, null, null }; 

を、dogsList[4]の値はnullです。参照しているオブジェクトの... setSizeを呼び出すためにそのヌル参照を逆参照しようとします。あなたはNullPointerExceptionを取得します。

この質問には本当に重要な概念がたくさんありますので、具体的な点について詳しくお尋ねください。

+0

ありがとう@Jon Skeet、あなたの答えは本当に役に立ちました! – Hazmat

2

setSizenullに設定してください。新しいDogオブジェクトを作成し、この配列のセルにオブジェクトを参照する必要があります。

Dog[] dogsList = new Dog[7]; 
dogList[4] = new Dog(); 
dogsList[4].setSize(4); 
3

あなたはDogsを保持するために配列をインスタンス化しました。配列内のオブジェクトをインスタンス化していません。

だから

Dog[] dogList = new Dog[7]; 
dogList[4] = new Dog(); 
dogList[4].setSize(4); 
1

他の記事は、スポットオン(意図なししゃれ;)ですので、私はあなたの犬のオブジェクトをインスタンス化し、あなたに別のアプローチを与えるでしょう。

すでに述べたように、あなたのコードは7つのDogオブジェクトで新しい配列を埋め込むのではなく、ヌル参照を含むサイズ7の配列を作成します。これらの参照は、の新しいインスタンスを指すことができますが、手動で行う必要はありません。 (既に行ったように)

  1. は全体の
  2. 反復を配列を作成します。

    それでは、これを試してみましょう、(自分の本来の意図であるように思われる)新しい犬のオブジェクトを使用して配列を埋めるためにアレイおよび各「スロット」

  3. Accessで新しい犬オブジェクトを作成し、アレイ内の犬の一つと呼び出しメソッドのsetSize()

Dog[] dogsList = new Dog[7]; 

for(int i=0; i<dogsList.length; i++) { 
    dogsList[i] = new Dog(); 
} 

//will work because each slot in dogsList now points to a Dog instance 
dogsList[4].setSize(4); 

関連する問題