Трассировка стека NullPointerException недоступна без агента отладки
Недавно я обнаружил ошибку, которая вызывает исключение NullPointerException. Исключение перехватывается и регистрируется с использованием стандартного оператора slf4j. Сокращенный код ниже:
for(Action action : actions.getActions()) {
try {
context = action.execute(context);
} catch (Exception e) {
logger.error("...", e);
break;
}
}
Как видите, ничего особенного. Однако из всех имеющихся у нас операторов регистрации исключений только этот не выводит трассировку стека. Все, что он печатает, - это сообщение (представленное как «...») и имя класса исключения (java.lang.NullPointerException).
Так как трассировка стека для исключения загружена лениво, я подумал, что может быть какая-то проблема с переупорядочением команд, и решил вызвать e.getStackTrace () перед оператором log. Это не имеет значения.
Так что я решил перезапустить с включенным агентом отладки. Однако, поскольку я даже подключился к процессу, я заметил, что теперь следы стека печатались. Очевидно, что присутствие агента отладки привело к появлению дополнительной информации об отладке.
С тех пор я установил причину исключения. Но я хотел бы узнать, почему трассировка стека была недоступна без отладчика. Кто-нибудь знает
Уточнение: это не проблема ведения журнала. Представьте себе то же самое предложение try / catch, но в подвохе я печатаю значение:
e.getStackTrace().length
Без отладчика это печатает '0', с отладчиком это печатает положительное число (9 в этом случае).
Дополнительная информация: это происходит на JDK 1.6.0_13, 64-битной, amd64, Linux 2.6.9