Если я вызываю метод run() в потоке, а метод run() бросает неискушенное исключение, каков будет результат?
Кто ловит это исключение? Его даже поймают?
Ответ 1
Если для ThreadGroup установлен обработчик исключений, JVM передает ему исключение. Если это поток AWT, вы можете установить обработчик событий для других необработанных исключений. В противном случае JVM обрабатывает его.
Пример группы потоков с пользовательским обработчиком и как его использовать:
public class MyThreadGroup extends ThreadGroup {
public MyThreadGroup() {
super("My Thread Group");
}
public void uncaughtException(Thread t, Throwable ex) {
// Handle exception
}
}
Thread t = new Thread(new MyThreadGroup(), "My Thread") { ... };
t.start();
Пример использования обработчика исключений AWT:
public class MyExceptionHandler {
public void handle(Throwable ex) {
// Handle exception
}
public void handle(Thread t, Throwable ex) {
// Handle exception
}
}
System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName());
Ответ 2
Если вы отправили Runnable в ExecutorService, вы можете поймать Исключение как завернутое внутри ExecutionException. (Очень рекомендуется для простого вызова run())