Метод run() потока не может генерировать никаких контролируемых исключений, но может быть прерван неконтролируемым исключением. В этом случае поток уничтожается.
Однако нет конструкции catch, куда может распространиться исключение. Вместо этого непосредственно перед смертью потока исключение передается обработчику неперехваченных исключений.Обработчик должен относиться к классу, реализующему интерфейс Thread.UncaughtExceptionHandler. Этот интерфейс имеет единственный метод:
1 |
void uncaughtException(Thread t, Throwable e) |
Начиная с Java SE 5.0, вы можете инсталлировать обработчик в любой поток методом setUncaughtExceptionHandler.
Вы можете также инсталлировать обработчик по умолчанию для всех потоков с помощью статического метода setDefaultUncaughtExceptionHandler() класса Thread.
Заменяющий обработчик может использовать API протоколирования для отправки отчетов о необработанных исключениях в файл протокола.
Если вы не инсталлируете обработчик по умолчанию, то им является null. Однако если вы не инсталлируете обработчик для индивидуального потока, то обработчиком является объект потока ThreadGroup.
Группа потоков — это коллекция потоков, которой можно управлять совместно. По умолчанию все потоки, которые вы создаете, относятся к одной и той же группе потоков, но можно устанавливать и другие группы. Поскольку в Java SE 5.0 появились лучшие средства для операций над коллекциями потоков, вам не нужно использовать группы потоков в ваших собственных программах.
Если ThreadGroup реализует интерфейс Thread.UncaughtExceptionHandler. Его метод uncaughtException() выполняет следующие действия.
- Если группа потоков не имеет родителя, вызывается метод uncaughtException() родительской группы.
- В противном случае, если метод Thread.getDefaultExceptionHandler возвращает отличный от null обработчик, вызывается этот обработчик.
- В противном случае, если Throwable является экземпляром ThreadDeath, то ничего не происходит.
- В противном случае имя потока и трассировка стека Throwable печатаются в потоке ошибок System.err.