В процессе работы программы могут возникать ситуации, нарушающие нормальный ход вычислений: деление на нуль, ошибка обмена, ошибка при обращении по сети, попытка создать экземпляр абстрактного класса и т. д. Такие ситуации принято называть исключительными ситуациями, или исключениями.
По умолчанию в подобных случаях интерпретатор Java выводит сообщение, описывающее исключительную ситуацию, и завершает работу программы.
Учитывая, что ряд Java-программ выполняется под управлением других систем, становится ясно, что описанная реакция на возникновение исключительных ситуаций не всегда приемлема. Чтобы изменить порядок обработки исключений, надо при создании программы принять описанные ниже меры.
Фрагменты кода, которые могут генерировать исключительные ситуации, следует поместить в блок try следующего формата:
try
{
…
Последовательность команд
…
}
Непосредственно за блоком try должен размещаться как минимум один блок catch, который выглядит так:
catch (описание_исключения)
{
…
Команды обработки исключительной ситуации
…
}
При нормальной работе программы наличие блока try никак не сказывается на её выполнении. По завершении фрагмента, предшествующего блоку try, управление передается внутрь блока, а после того как все команды внутри блока будут выполнены, управление перейдет к первой команде, следующей после блока catch.
Для каждой категории исключительных ситуаций предусмотрен специальный класс, содержащий описания исключений. Так, например, арифметические ошибки описываются классом ArithmeticException, некорректная попытка создания объекта URL - классом с названием MalformedURLException и т. д.
Классы, которые описывают интересующие нас исключительные ситуации, являются подклассами класса Exception. Класс Exception, в свою очередь, является подклассом класса Throwable.
Иерархическая структура, включающая некоторые (очень немногие) классы, описывающие исключительные ситуации, представлена ниже.
Exception
!
!-- IOException
! !
! !-- MalformedURLException
! !
! !-- UnknownHostException
! …
!
!-- RuntimeException
!
!-- ArithmeticException
!
…
Рассмотрим блок try, содержащий несколько команд, и блоки catch, предназначенные для обработки исключительных ситуаций.
try
{
…
sock=new Socket (www.myserver.com, 80};
…
a=b/d;
…
}
catch (UnknownHostException ex)
{
Обработка исключительной ситуации UnknownHostException
}
catch (IOException ex)
{
Обработка исключительной ситуации IOException
}
catch (ArithmeticException ex)
{
Обработка исключительной ситуации ArithmeticException
}
За блоком try следуют три блока catch. Конструктор класса Socket, вызываемый в блоке try, может генерировать исключения UnknownHostException и IOException, а при делении b/d, если значение d будет равно нулю, возникнет исключительная ситуация ArithmeticException. Каждое из этих исключений обрабатывается отдельным блоком catch.
Однако код программы можно существенно сократить. Три блока catch можно заменить одним блоком, представленным ниже.
catch (Exception ex)
{
Обработка исключительных ситуаций всех типов
}
Если при выполнении метода может возникнуть исключительная ситуация, которая не обрабатывается в теле метода, необходимо специально оговорить это в тексте программы. При объявлении такого метода следует указать ключевое слово throws, сопровождаемое перечнем имён классов, описывающих исключительные ситуации, которые могут возникнуть при работе метода.