私はJavaを使用し始めていると私は犬のクラスオブジェクトの配列を作成しようとしていると私はこのエラーを取得しています:この行でのjava.lang.NullPointerException
Exception in thread "main" java.lang.NullPointerException
:
Dog[] dogsList = new Dog[7];
dogsList[4].setSize(4);
私はJavaを使用し始めていると私は犬のクラスオブジェクトの配列を作成しようとしていると私はこのエラーを取得しています:この行でのjava.lang.NullPointerException
Exception in thread "main" java.lang.NullPointerException
:
Dog[] dogsList = new Dog[7];
dogsList[4].setSize(4);
アレイを作成すると、それは参照の配列だ - 彼らはどんなインスタンス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"
、x
とy
変数の値は、彼らが(私は分で上に来るか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
を取得します。
この質問には本当に重要な概念がたくさんありますので、具体的な点について詳しくお尋ねください。
setSize
をnull
に設定してください。新しいDog
オブジェクトを作成し、この配列のセルにオブジェクトを参照する必要があります。
Dog[] dogsList = new Dog[7];
dogList[4] = new Dog();
dogsList[4].setSize(4);
第4要素dogsList[4]
がNULLであるためです。あなたはJavaで配列を読む必要があります。
これを参照してください:http://download.oracle.com/javase/tutorial/java/nutsandbolts/arrays.htmlと最後まで読んでください。
あなたはDogsを保持するために配列をインスタンス化しました。配列内のオブジェクトをインスタンス化していません。
だから
Dog[] dogList = new Dog[7];
dogList[4] = new Dog();
dogList[4].setSize(4);
他の記事は、スポットオン(意図なししゃれ;)ですので、私はあなたの犬のオブジェクトをインスタンス化し、あなたに別のアプローチを与えるでしょう。
すでに述べたように、あなたのコードは7つのDogオブジェクトで新しい配列を埋め込むのではなく、ヌル参照を含むサイズ7の配列を作成します。これらの参照は、の新しいインスタンスを指すことができますが、手動で行う必要はありません。 (既に行ったように)
それでは、これを試してみましょう、(自分の本来の意図であるように思われる)新しい犬のオブジェクトを使用して配列を埋めるためにアレイおよび各「スロット」
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);
ありがとう@Jon Skeet、あなたの答えは本当に役に立ちました! – Hazmat