UncaughtExceptionHandler изменяет сообщение об исключении

Небольшой пример:

 public class App {   
     public static void main(String[] args) {
         throw new RuntimeException("Test exception");
     }
 }

Печать следующая, как и ожидалось:

Exception in thread "main" java.lang.RuntimeException: Test exception
    at App.main(App.java:5)

Давайте изменим эту программу:

public class App {    
    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                if (e instanceof RuntimeException) throw (RuntimeException)e;
            }
        });
        throw new RuntimeException("Test exception");
    }
}

Печать:

Exception: java.lang.RuntimeException thrown from the UncaughtExceptionHandler in thread "main"

Вопрос:

Почему сообщение не содержит никакой информации о том, где оно происходит, и нет трассировки стека, сообщение?

Для меня сообщение об исключении выглядит странно.

1 ответ

Решение

Документация Java API гласит:

void uncaughtException(Thread t, Throwable e)

Метод вызывается, когда указанный поток завершается из-за данного необработанного исключения. Любое исключение, выбрасываемое этим методом, будет игнорироваться виртуальной машиной Java.

Поэтому, если вы хотите, чтобы программа завершила работу с некоторыми исключениями и напечатала их сообщение / трассировку стека, вы должны сделать:

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            if (e instanceof RuntimeException) {
                 e.printStackTrace();
                 System.exit(1);
            } 
        }
Другие вопросы по тегам