Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que eu tenho NullPointerException aqui?


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.