Recientemente encontré un error que causa una NullPointerException. La excepción se captura y se registra usando una declaración slf4j estándar. Código abreviado a continuación:NullPointerException stack trace no está disponible sin el agente de depuración
for(Action action : actions.getActions()) {
try {
context = action.execute(context);
} catch (Exception e) {
logger.error("...", e);
break;
}
}
Como puede ver, nada especial. Sin embargo, de todas las declaraciones de registro de excepciones que tenemos, solo esta no imprime un seguimiento de pila. Todo lo que imprime es el mensaje (representado como "...") y el nombre de la clase de excepción (java.lang.NullPointerException).
Dado que el seguimiento de la pila de una excepción está cargado de forma diferida, pensé que tal vez hay un problema de reorganización de instrucciones y decidí llamar a e.getStackTrace() antes de la declaración de registro. Esto no hizo diferencia.
Así que decidí reiniciar con el agente de depuración habilitado. Sin embargo, debido a que incluso adjunté el proceso, noté que ahora los trazos de pila estaban imprimiendo. Entonces, claramente, la presencia del agente de depuración provocó que estuviera disponible cierta información de depuración adicional.
Desde entonces he solucionado la causa de la excepción. Pero me gustaría saber por qué el seguimiento de la pila no estaba disponible sin un depurador. ¿Nadie sabe?
aclaración: esto no es un problema de registro. Imagínese el mismo bloque try/catch, pero en la captura, imprimo el valor de:
e.getStackTrace().length
Sin un depurador este impresiones '0', con un depurador que se imprime un número positivo (9 en este caso).
Más información: esto está sucediendo en JDK 1.6.0_13 de 64 bits en AMD64, Linux 2.6.9
¿qué vm estás usando? ese comportamiento suena * muy * raro. –
JDK 1.6.0_13, 64 bits en Linux 2.6.9 – omerkudat
¿Qué sucede cuando "arrojas una nueva NullPointerException() 'dentro del intento? – seth