Nie jest dostępny ślad stosu NullPointerException bez agenta debugowania

Niedawno znalazłem błąd powodujący wyjątek NullPointerException. Wyjątek jest przechwytywany i rejestrowany przy użyciu standardowej instrukcji slf4j. Skrócony kod poniżej:

for(Action action : actions.getActions()) {
    try {
        context = action.execute(context);
    } catch (Exception e) {
        logger.error("...", e);
        break;
    }
}

Jak widać, nic nadzwyczajnego. Jednak ze wszystkich instrukcji rejestrowania wyjątków, które mamy, tylko ten nie drukuje śladu stosu. Wszystko, co drukuje, to komunikat (reprezentowany jako „...”) oraz nazwa klasy wyjątku (java.lang.NullPointerException).

Ponieważ ślad stosu na wyjątku jest załadowany leniwie, pomyślałem, że może istnieje jakiś problem z ponownym porządkowaniem instrukcji i postanowiłem wywołać e.getStackTrace () przed instrukcją dziennika. To nie robiło różnicy.

Zdecydowałem się zrestartować z włączonym agentem debugowania. Jednakże, ponieważ nawet przyłączyłem się do tego procesu, zauważyłem, że teraz ślady stosu są drukowane. Tak więc obecność agenta debugowania spowodowała, że ​​niektóre dodatkowe informacje debugowania stały się dostępne.

Od tego czasu poprawiłem główną przyczynę wyjątku. Ale chciałbym się dowiedzieć, dlaczego śledzenie stosu było niedostępne bez debugera. Ktoś wie?

Wyjaśnienie:to nie jest problem z logowaniem. Wyobraź sobie tę samą klauzulę try / catch, ale w haku wypisuję wartość:

e.getStackTrace().length

Bez debugera wypisuje „0”, z debuggerem wypisuje liczbę dodatnią (w tym przypadku 9).

Więcej informacji: dzieje się to na JDK 1.6.0_13, 64bit, amd64, linux 2.6.9

questionAnswers(3)

yourAnswerToTheQuestion