暗闇の中で根本的な原因を探すのではなく、NPEが発生する方法と理由、およびそれらを回避する方法を説明する方がよいと思います。そうすれば、OPは新たに得た知識を適用して、自分の些細な問題を探すことができます。
ほら、オブジェクト参照(変数)には、十分な価値のあるObject
を含めることができます。 または単に何も 、これはnull
。
SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.
ここで、何もにアクセスしようとしている場合 (null
)、間違いなくNullPointerException
を取得します 、単にnull
変数やメソッドはありません。
someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.
これを回避するのはかなり簡単です。基本的に2つの方法で実行できます。インスタンス化するか、単に無視するかです。
if (someObject2 == null) {
someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!
または
if (someObject2 != null) {
someObject2.doSomething(); // No NPE anymore!
}
NPEの場合、スタックトレースの最初の行番号は、それが発生した正確な行を指します。あなたは文字通り「272行目はadmin.birthList.add(list1);
です」と言いました "。この行には2つが含まれています オブジェクト参照がアクセス/呼び出される場所(ドット.
を使用) オペレーター)。最初はadmin.birthList
2番目はbirthList.add(list1)
。一方または両方がNPEを引き起こしたかどうかを確認するのはあなた次第です。それが最初の呼び出しである場合は、admin
単にnull
です 。 2回目の呼び出しの場合は、birthList
単にnull
です 。十分な価値のあるオブジェクトでインスタンス化することで修正できます。
編集: (コメントからわかるように)根本的な原因を特定するのに苦労している場合は、デバッグを学ぶ必要があります。 System.out.println()
を使用して、デバッガーを実行するか、「貧乏人のデバッグ」を実行します。 それらにアクセス/呼び出す前にすべての変数の。まず、NPEが発生している行を確認します。これが例えば
admin.birthList.add(list1);
次に、根本的な原因を突き止めるために、次のように変更する必要があります。
System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);
それらのいずれかがnull
を出力するかどうかを確認します 。または、次のこともできます:
if (admin == null) throw new NullPointerException("admin is null!");
List<Birth> birthList = admin.birthList;
if (birthList == null) throw new NullPointerException("birthList is null!");
birthList.add(list1);
また、個々の呼び出しを別々の行に分けて、どの参照がnullであるかを知るのに十分な行番号を確保することもできます。
List<Birth> birthList = admin.birthList; // If NPE line points here, then admin is null.
birthList.add(list1); // If NPE line points here, then birthList is null.