sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué tengo NullPointerException aquí?

En lugar de buscar la causa raíz en la oscuridad, creo que es mejor explicar cómo y por qué se producen los NPE y cómo se pueden evitar, de modo que el OP pueda aplicar el conocimiento recién adquirido para buscar su propio problema trivial.

Mire, las referencias a objetos (las variables) pueden contener un Object completo o simplemente nada , que es null .

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

Ahora, si está tratando de acceder a nada (null ), entonces sin duda obtendrá una NullPointerException , simplemente porque null no tiene variables ni métodos.

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

La solución a esto es bastante simple. Se puede hacer básicamente de dos maneras:instanciando o simplemente ignorándolo.

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

o

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

En el caso de un NPE, el número de la primera línea del stacktrace apunta a la línea exacta donde se ha producido. Dijiste literalmente "la línea 272 es admin.birthList.add(list1); ". Esta línea contiene dos lugares donde se accede/invoca referencias de objetos (usando el punto . operador). El primero es admin.birthList y el segundo es birthList.add(list1) . Depende de usted averiguar si uno o ambos causaron la NPE. Si es la primera invocación, entonces admin es simplemente null . Si es la segunda invocación, entonces birthList es simplemente null . Puede solucionarlo creando una instancia con un objeto completo.

Editar: Si tiene dificultades para determinar la causa raíz (como se desprende de los comentarios), entonces necesita aprender a depurar. Ejecute un depurador o simplemente haga una "depuración de pobres" con la ayuda de un System.out.println() de cada variable antes de acceder/invocarlas. Primero observe la línea donde se produce la NPE. Si esto es por ejemplo

admin.birthList.add(list1);

entonces debe cambiarlo de la siguiente manera para determinar la causa raíz:

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

compruebe si alguno de ellos imprime null . Alternativamente, también puede hacer:

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

también puede separar las invocaciones individuales en líneas separadas para que tenga suficiente número de línea para saber qué referencia es 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.