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.