Recentemente ho trovato un bug che causa una NullPointerException. L'eccezione viene rilevata e registrata utilizzando un'istruzione standard slf4j. Codice abbreviato di seguito:NullPointerException trace trace non disponibile senza agente di debug
for(Action action : actions.getActions()) {
try {
context = action.execute(context);
} catch (Exception e) {
logger.error("...", e);
break;
}
}
Come potete vedere, niente di speciale. Tuttavia, di tutte le dichiarazioni di registrazione delle eccezioni che abbiamo, solo questa non stampa una traccia dello stack. Tutto ciò che stampa è il messaggio (rappresentato come "...") e il nome della classe di eccezione (java.lang.NullPointerException).
Poiché la traccia dello stack su un'eccezione è lazy loaded, ho pensato che forse c'è un problema di riordino delle istruzioni di qualche tipo e ho deciso di chiamare e.getStackTrace() prima dell'istruzione del registro. Questo non ha fatto differenza.
Quindi ho deciso di riavviare con l'agente di debug abilitato. Tuttavia, poiché mi sono persino collegato al processo, ho notato che ora le tracce dello stack stavano stampando. Quindi, chiaramente la presenza dell'agente di debug ha reso disponibili alcune informazioni di debug aggiuntive.
Da allora ho risolto la causa principale dell'eccezione. Ma vorrei sapere perché la traccia dello stack non era disponibile senza un debugger. Qualcuno sa?
Chiarimento: questo non è un problema di registrazione. Immaginate la stessa clausola try/catch, ma nella cattura, ho stampare il valore di:
e.getStackTrace().length
Senza un debugger questa stampe '0', con un debugger viene stampato un numero positivo (9 in questo caso).
Maggiori informazioni: questo sta accadendo su JDK 1.6.0_13, 64bit, AMD64, Linux 2.6.9
che vm stai usando? quel comportamento suona * molto * strano. –
JDK 1.6.0_13, 64bit su linux 2.6.9 – omerkudat
Cosa succede quando si lancia il nuovo NullPointerException() 'all'interno del tentativo? – seth