Трассировка стека 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

Ответы на вопрос(3)

Ваш ответ на вопрос