Каждый раз, когда какой-либо поток генерирует исключение, которое не обрабатывается нигде в его стеке вызовов, будет вызываться UncaughtExceptionHandler
, присутствующее в Thread
(см. Thread.setUncaughtExceptionHandler
). . Это относится не только к потоку по умолчанию main
, но и ко всем, созданным вручную. По умолчанию поток main
не имеет UncaughtExceptionHandler
.
Если у Thread
его нет, то ThreadGroup
обрабатывает его, как описано в ThreadGroup.uncaughtException
.
Это демонстрирует, как будет выглядеть простой обработчик исключений:
class ExceptionHandlerSample {
public static void main(String[] args) {
Thread.currentThread().setUncaughtExceptionHandler(new MyExceptionHandler());
((Object) null).toString(); // force a NullPointerException to be thrown.
}
}
class MyExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("Thread %s threw an exception of type %s: %s",
t.getName(), e.getClass().getSimpleName(), e.getMessage());
}
}