Zamiast polować na pierwotną przyczynę w ciemności, myślę, że lepiej wyjaśnić, jak i dlaczego powstają NPE i jak można ich uniknąć, aby OP mógł zastosować nowo zdobytą wiedzę do polowania na swój własny trywialny problem.
Spójrz, odniesienia do obiektów (zmienne) mogą zawierać w pełni wartościowy Object
lub po prostu nic , czyli null
.
SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.
Teraz, jeśli próbujesz uzyskać dostęp do niczego (null
), bez wątpienia otrzymasz NullPointerException
po prostu dlatego, że null
nie ma żadnych zmiennych ani metod.
someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.
Obejście tego jest dość proste. Można to zrobić na dwa sposoby:albo przez utworzenie instancji, albo po prostu przez zignorowanie.
if (someObject2 == null) {
someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!
lub
if (someObject2 != null) {
someObject2.doSomething(); // No NPE anymore!
}
W przypadku NPE, pierwszy numer linii stosu wskazuje dokładnie linię, w której zostało spowodowane. Powiedziałeś dosłownie „linia 272 to admin.birthList.add(list1);
”. Ten wiersz zawiera dwa miejsca, w których uzyskano dostęp/wywołano odwołania do obiektów (za pomocą kropki .
operator). Pierwszy to admin.birthList
a drugi to birthList.add(list1)
. Od Ciebie zależy, czy jeden z nich lub oba spowodowały NPE. Jeśli jest to pierwsze wywołanie, to admin
jest po prostu null
. Jeśli jest to drugie wywołanie, to birthList
jest po prostu null
. Możesz to naprawić, tworząc jego instancję za pomocą pełnowartościowego obiektu.
Edytuj: Jeśli masz trudności z ustaleniem przyczyny źródłowej (jak wynika z komentarzy), musisz nauczyć się debugowania. Uruchom debuger lub po prostu wykonaj "debugowanie biednego człowieka" za pomocą System.out.println()
każdej zmiennej przed uzyskaniem dostępu/wywołaniem do nich. Najpierw spójrz na linię, w której powstaje NPE. Jeśli to na przykład
admin.birthList.add(list1);
następnie musisz to zmienić w następujący sposób, aby ustalić podstawową przyczynę:
System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);
sprawdź, czy któryś z nich wypisuje null
. Alternatywnie możesz również zrobić:
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);
możesz także rozdzielić poszczególne wywołania w oddzielnych wierszach, aby mieć wystarczająco dużo do numeru wiersza, aby wiedzieć, które odwołanie jest puste.
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.