Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego mam tutaj wyjątek NullPointerException?

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapis DataFrame do tabeli mysql za pomocą pySpark

  2. Implementacja MySQL z CUDA

  3. Oblicz średnią kolumny z zapytania MYSQL

  4. Pobierz zmienną w pętli while na podstawie tego, co wybiera użytkownik?

  5. MYSQL - Jak uzyskać kolumny niezagregowane z tabeli opartej na kolumnie zagregowanej