Mysql
 sql >> Database >  >> RDS >> Mysql

Perché ho NullPointerException qui?

Invece di cercare la causa principale nell'oscurità, penso che sia meglio spiegare come e perché le NPE sono causate e come possono essere evitate, in modo che l'OP possa applicare le nuove conoscenze acquisite per dare la caccia al proprio problema banale.

Guarda, i riferimenti agli oggetti (le variabili) possono contenere un Object completo o semplicemente niente , che è null .

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

Ora, se stai tentando di accedere a niente (null ), otterrai senza dubbio una NullPointerException , semplicemente perché null non ha variabili o metodi.

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

Risolvere questo problema è abbastanza semplice. Può essere fatto fondamentalmente in due modi:o istanziandolo o semplicemente ignorandolo.

if (someObject2 == null) {
    someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!

o

if (someObject2 != null) {
    someObject2.doSomething(); // No NPE anymore!
}

In caso di NPE, il numero della prima riga dello stacktrace indica la riga esatta in cui è stato causato. Hai detto letteralmente "la riga 272 è admin.birthList.add(list1); ". Questa riga ne contiene due luoghi in cui è stato effettuato l'accesso/richiamato ai riferimenti agli oggetti (usando il punto . operatore). Il primo è admin.birthList e il secondo è birthList.add(list1) . Sta a te scoprire se uno o entrambi hanno causato l'NPE. Se è la prima chiamata, allora admin è semplicemente null . Se è la seconda invocazione, allora birthList è semplicemente null . Puoi risolverlo istanziandolo con un oggetto degno di nota.

Modifica: Se hai difficoltà a determinare la causa principale (come risulta dai commenti), devi imparare il debug. Esegui un debugger o semplicemente esegui il "debug dei poveri" con l'aiuto di un System.out.println() di ogni variabile prima di accedervi/richiamarle. Primo sguardo alla riga in cui è causato l'NPE. Se questo è per esempio

admin.birthList.add(list1);

quindi è necessario modificarlo come segue per individuare la causa principale:

System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);

controlla se qualcuno di loro stampa null . In alternativa puoi anche fare:

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);

puoi anche separare le singole chiamate su righe separate in modo da avere abbastanza numero di riga per sapere quale riferimento è nullo.

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.