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.