2015-05-18 9 views
2

Я создал глобальный обработчик исключений:исключения резьбы без StackTrace

Thread.setDefaultUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler()); 

с довольно простой реализацией:

public class DefaultUncaughtExceptionHandler implements UncaughtExceptionHandler { 

    public static final Logger logger = LoggerFactory.getLogger(DefaultUncaughtExceptionHandler.class); 

    @Override 
    public void uncaughtException(Thread t, Throwable e) { 
     logger.error("Uncaught Exception detected in thread {}", t, e); 
    } 

}

иногда я вижу в журналах этого исключения в несколько раз:

[AWT-EventQueue-0] DefaultUncaughtExceptionHandler - Uncaught Exception detected in thread Thread[AWT-EventQueue-0,6,main] 
java.lang.ArrayIndexOutOfBoundsException: null 

, но я не могу найти, откуда он.

Как вы думаете, почему stacktrace пуст? Он не должен быть пустым, все потоки должны создаваться, по крайней мере, из основного «основного» потока или любого другого.

+0

ли другие исключения войти должным образом, включая их трассировки стека? Просто чтобы убедиться, что с вызовом журнала нет проблем. –

+0

Трассировка стека не содержит информации о родительском потоке. Он просто содержит стек текущего потока, независимо от того, какой поток начал его запускать. – RealSkeptic

+0

В какой библиотеке находятся Logger и LoggerFactory? – ControlAltDel

ответ

3

Компилятор JIT может сделать некоторые оптимизации и «потерять» трассировки стека.

Вы можете использовать следующий флаг виртуальной машины Java, чтобы отключить эту оптимизацию:

-XX:-OmitStackTraceInFastThrow 

Ссылка: http://jawspeak.com/2010/05/26/hotspot-caused-exceptions-to-lose-their-stack-traces-in-production-and-the-fix/

+0

Я надеюсь, что это работает для JDK8. Я постоянно получаю редкое «ArrayIndexOutOfBoundsException» в уведомлении по электронной почте от производства, которое я не могу воспроизвести, и он всегда пуст. – coladict

+0

Не работает в JDK 8. –

Смежные вопросы