Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо имам NullPointerException тук?

Вместо да търсим първопричината в тъмното, мисля, че е по-добре да обясним как и защо се причиняват NPE и как могат да бъдат избегнати, така че ОП да може да приложи новопридобитите знания, за да търси собствения си тривиален проблем.

Вижте, препратките към обекти (променливите) могат да съдържат или пълноценен Object или просто нищо , което е null .

SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.

Сега, ако се опитвате да получите достъп до нищо (null ), тогава несъмнено ще получите NullPointerException , просто защото null няма никакви променливи или методи.

someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.

Заобикалянето на това е доста просто. Това може да стане основно по два начина:или като го създадете, или просто като го игнорирате.

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); ". Този ред съдържа две места, където препратките към обекти са достъпни/извиквани (с помощта на точката . оператор). Първият е admin.birthList а второто е birthList.add(list1) . От вас зависи да разберете дали едното или и двете са причинили NPE. Ако това е първото извикване, тогава admin е просто null . Ако е второто извикване, тогава 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);

можете също да разделите отделните извиквания на отделни редове, така че да имате достатъчно номер на реда, за да знаете коя препратка е нулева.

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. Отделна клауза за свързване в съставен индекс

  2. Най-добрият начин за изтриване на mysql редове от html страница - изтриване на връзка и php

  3. mysql - Псевдоним на динамична колона

  4. Как да получите остатък с помощта на MOD() в PostgreSQL, MS SQL Server и MySQL

  5. Как да направя подходящ клас за разширение на mysqli с подготвени оператори?