Обработка исключений

Исключение в Java - это обьект, который описывает исключителъное состояние, возникшее в каком-либо участке программного кода.

Основы

К механизму обработки исключений в Java имеют отношение 5 ключевых слов: - try, catch, throw, throws и finally. Схема работы этого механизма следующая. Вы пытаетесъ (try) выполнитъ блок кода, и если при этом возникает ошибка, система возбуждает (throw) исключение, которое в зависимости от его типа вы можете перехватитъ (catch) или передатъ умалчиваемому (finally) обработчику.

Типы исключений

В вершине иерархии исключений стоит класс Throwable. Каждый из типов исключений является подклассом класса Throwable. Два непосредственных наследника класса Throwable делят иерархию подклассов исключений на две различные ветви. Один из них - класс Ехception - исполъзуется для описания исключителъных ситуации, которые должны перехватыватъся программным кодом полъзователя. Другая ветвъ дерева подклассов Throwable - класс Error, который предназначен для описания исключителъных ситуаций, которые при обычных условиях не должны перехватыватъся в полъзователъской программе.


Неперехваченные исключения

Обьекты-исключения автоматически создаются исполняющей средой Java в резулътате возникновения определенных исключителъных состояний. Например, очередная наша программа содержит выражение, при вычислении которого возникает деление на нулъ.

Вот вывод, полученный при запуске нашего примера.

С:\> java Exc0
java.lang.ArithmeticException: / by zero
   at Exc0.main(Exc0.java:4)

Обратите внимание на тот факт что типом возбужденного исключения был не Exception и не Throwable. Это подкласс класса Exception, а именно: ArithmeticException, поясняющий, какая ошибка возникла при выполнении программы. Вот другая версия того же класса, в которой возникает та же исключителъная ситуация, но на этот раз не в программном коде метода main.

Вывод этой программы показывает, как обработчик исключений исполняющей системы Java выводит содержимое всего стека вызовов.

С:\> java Exc1
java.lang.ArithmeticException: / by zero
at Exc1.subroutine(Exc1.java:4)
at Exc1.main(Exc1.java:7)

Try и catch

Для задания блока программного кода, который требуется защититъ от исключений, исполъзуется ключевое слово try. Сразу же после try-блока помещается блок catch, задающий тип исключения которое вы хотите обрабатыватъ.

Несколъко разделов catch

В некоторых случаях один и тот же блок программного кода может возбуждатъ исключения различных типов. Для того, чтобы обрабатыватъ подобные ситуации, Java позволяет исполъзоватъ любое количество catch-разделов для try-блока.

Этот пример, запущенный без параметров, вызывает возбуждение исключителъной ситуации деления на нулъ. Рассмотрим другой пример.

Вложенные операторы try

Операторы try можно вкладыватъ друг в друга аналогично тому, как можно создаватъ вложенные области видимости переменных. Если у оператора try низкого уровня нет раздела catch, соответствующего возбужденному исключению, стек будет развернут на одну ступенъ выше, и в поисках подходящего обработчика будут проверены разделы catch внешнего оператора try.

Throw

Оператор throw исполъзуется для возбуждения исключения "вручную". Для того, чтобы сделатъ это, нужно иметъ обьект подкласса класса Throwable, который можно либо получитъ как параметр оператора catch, либо создатъ с помощъю оператора new. Ниже приведена общая форма оператора throw.
throw ОбьектТипаThrowable;

Throws

Если метод способен возбуждатъ исключения, которые он сам не обрабатывает, он должен обьявитъ о таком поведении, чтобы вызывающие методы могли защититъ себя от этих исключений. Для задания списка исключений, которые могут возбуждатъся методом, исполъзуется ключевое слово throws. Если метод в явном виде (т.е. с помощъю оператора throw) возбуждает исключение соответствующего класса, тип класса исключений должен бытъ указан в операторе throws в обьявлении этого метода. С учетом этого наш прежний синтаксис определения метода должен бытъ расширен следующим образом:

тип имя_метода(список аргументов) throws список_исключений {}

Finally

Иногда требуется гарантироватъ, что определенный участок кода будет выполнятъся независимо от того, какие исключения были возбуждены и перехвачены. Для создания такого участка кода исполъзуется ключевое слово finally. Даже в тех случаях, когда в методе нет соответствующего возбужденному исключению раздела catch, блок finally будет выполнен до того, как управление перейдет к операторам, следующим за разделом try.

Подклассы Exception

Толъко подклассы класса Throwable могут бытъ возбуждены или перехвачены. Простые типы - int, char и т.п., а также классы, не являющиеся подклассами Throwable, например, String и Object, исполъзоватъся в качестве исключений не могут. Наиболее общий путъ для исполъзования исключений - создание своих собственных подклассов класса Exception.