Em vez de caçar a causa raiz no escuro, acho melhor explicar como e por que os NPEs são causados e como eles podem ser evitados, para que o OP possa aplicar o conhecimento recém-adquirido para caçar seu próprio problema trivial.
Veja, as referências de objeto (as variáveis) podem conter um
Object
completo ou simplesmente nada , que é null
. SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.
Agora, se você está tentando acessar nada (
null
), então você sem dúvida receberá um NullPointerException
, simplesmente porque null
não tem nenhuma variável ou método. someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.
A solução alternativa é bastante simples. Isso pode ser feito basicamente de duas maneiras:instanciando-o ou simplesmente ignorando-o.
if (someObject2 == null) {
someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!
ou
if (someObject2 != null) {
someObject2.doSomething(); // No NPE anymore!
}
No caso de um NPE, o número da primeira linha do stacktrace aponta a linha exata onde ele foi causado. Você disse literalmente "linha 272 é
admin.birthList.add(list1);
". Esta linha contém dois locais onde as referências de objetos são acessadas/chamadas (usando o ponto .
operador). O primeiro é admin.birthList
e o segundo sendo birthList.add(list1)
. Cabe a você descobrir se um ou ambos causaram o NPE. Se for a primeira invocação, então admin
é simplesmente null
. Se for a segunda invocação, então birthList
é simplesmente null
. Você pode corrigi-lo instanciando-o com um objeto fullworthy. Editar: Se você tiver dificuldade em determinar a causa raiz (como resulta dos comentários), precisará aprender a depurar. Execute um depurador ou apenas faça "depuração do pobre homem" com a ajuda de um
System.out.println()
de cada variável antes de acessá-las/invocá-las. Primeiro, observe a linha onde o NPE é causado. Se isso é por exemplo admin.birthList.add(list1);
então você precisa alterá-lo da seguinte forma para descobrir a causa raiz:
System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);
verifique se algum deles imprime
null
. Alternativamente, você também pode fazer: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);
você também pode separar as invocações individuais em linhas separadas para ter o número da linha suficiente para saber qual referência é nula.
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.