Главная » Java » ПОТОКИ и исключения Java

0

Исключительная ситуация всегда возникает в контексте определенного потока в результате действий, выполняемых потоком, _ например, при осуществлении операции целочисленного деления на нуль или принудительного выбрасыва-

ния объекта исключения. Подобные исключения относятся к категории синхронных и всегда воздействуют только на текущий поток.

Выбрасывание исключения приводит к внезапному прерыванию текущих инструкций программы и далее, по цепочке в стеке вызовов, к прекращению работы соответствующих методов. Если исключение не обрабатывается к моменту завершения выполнения метода run, мы имеем дело с так называемым необрабатываемым исключением (uncaught exception). Когда работа потока, Который встретился с исключительной ситуацией, завершается, объект исключения также прекращает свое существование. Поскольку необрабатываемые исключения обычно свидетельствуют о серьезных проблемах, необходимы некие средства, позволяющие проследить причины их возникновения. С этой целью Исполняющая система вызывает метод uncaughtException объекта ThreadGroup группы, которой принадлежит "пострадавший" поток.

Реализация метода uncaughtException, принятая по умолчанию, предполагает вызов одноименного метода объекта "родительской" группы, если таковая есть, либо, в противном случае, обращение к методу printStackTrace объекта исключения, а также вывод информации об исключении на экран. Если необходимо исследовать необрабатываемые исключения каким-то нетрадиционным способом, метод uncaughtException можно переопределить. Если, например, речь идет о графическом приложении, целесообразно предусмотреть возможность вывода информации трассировки стека вызовов в отдельное окно вместо использования стандартной консоли system.error, которой пользуется метод printStackTrace. Для этого нетрудно написать собственную версию uncaughtException, в которой вывод информации трассировки перенаправляется в окно, создаваемое специально для этой цели.

Если "родительскому" потоку необходима информация о причине аварийного завершения работы дочернего потока, последний должен сохранить ее в таком месте, откуда первый будет способен ее "достать". Размещение вызова метода start объекта потока внутри конструкции try … catch не позволяет отлавливать исключения, генерируемые в процессе работы нового потока, – такая мера помогает справиться только с теми исключениями, которые выбрасываются методом start как таковым.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии