Java - обработка исключений - исключения - описание

Общие сведения

  1. Исключение - ситуация, когда "что-то пошло не так" - это описание "ошибки времени выполнения"
  2. В Java механизм обработки во многом "автоматизирован" - в других языках (некоторых) ошибки возможно, придётся проверять "вручную"
  3. Управление ошибками в Яве перенесено в мир ООП
  4. Исключение в Java - это объект - именно он и описывает ошибку которая произошла
  5. Исключение в данной части кода можно либо обработать либо пропустить
  6. Исключения могут быть созданы системой времени исполнения Java, или же вручную
  7. Исключения созданные вручную позволяют уведомить вызывающий код о проблемах
  8. В Яве есть пять слов для работы с исключениями: try, catch, throw, throws, finally
  9. Все исключения в Яве являются подклассами класса Trowable - от которого наследуются системные Exception и Error. Первый (и его подкласс Exception) для пользовательского кода, а второй для ошибок, которые могут возникнуть в самой среде Java

Общая схема в коде (пример)

try { // блок перехвата исключения

// Здесь какой-то код, в котором может быть оишибка
// например из этой области может быть порождено автоматическое
// исключение от системы исполнения Java
}
catch (ТипИсключения1 е) { // обработка исключения

// обработчик исключений типа ТипИсключения1 
}
catch (ТипИсключения2 е) {

// обработчик исключений типа ТипИсключения2

     throw(e)   // повторное (вручную) пересоздадим исключение		   
}
finally { // блок который следует выполнять после блока  try{}

} 

Необработанные исключения

  1. Как только возникает "ошибка" система исполнения Явы генерирует исключение и "передаёт" его на обработку - работа класса, который произвёл ошибку прерывается.
  2. Если программист не предусмотрел собственный обработчик (так называемый стандартный обработчик), то исключение будет обработано стандартным образом средой исполнения
  3. Стандартный обработчик в том числе выводит текстовую информацию о классе в котором произошла ошибка и типе исключения - там будет указан и номер строки кода, которая породила исключение
  4. Трассировка стека, выводимая стандартным обработчиком показывает в какой последовательности вызывались методы до ошибки (выведется именно ветка вызовов ведущая к ошибке)

Обработка исключения программистом

Использование собственных обработчиков имеет два основных преимущества:

  1. Можно на лету "исправлять" ошибки
  2. Мы предотвращаем атоматическое прерывание исполнения программы

Блок try catch - особенности

  1. try catch - это единый блок, то есть данные слова в программе всегда используются "вместе"
  2. Действие catch не распространяется на те операторы, которые идут до блока try (распространяется только на те, что внутри try)
  3. Смысл использования catch - "обработать" "неприятную" ситуацию и не дать программе прервать своё выполнение.

Отображение описания исключения - вывод текстовой информации об исключении на экран

Класс Trowable (см. выше) имеет метод toString() - а потому всякое исключение можно просто передать "на печать", например в метод .println() консоли

Множественные операторы catch

  1. Один фрагмент кода может породить более одного исключения - в этом случае надо использовать несколько блоков catch для одного try - каждый из блоков catch попытается обработать исключение, точнее - исключение будет обрабатывать его если тип этого исключения соответствует типу параметра "ожидаемого" блоком (указывается в скобках по аналогии с аргументом функции) - после того как выполнится хотя бы один catch, все остальные его "собратья"-блоки catch пропускаются и выполнения подолжается уже за пределами связки try + catch
  2. Здесь важно помнить ,что обработчики (catch-блоки) подклассов исключений должны идти раньше обработчиков суперклассов - иначе обработчики подклассов просто никогда не выполнятся , даже если исключение и будет сгенерировано - а недостижимый кода в Java является ошибкой

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

  1. Операторы try можно вкладывать один в другой - при этом если исключение будет сгенерировано в одном из них обработчик будет искаться (опять же - подходящий обработчик, это такой, который ожидает исключение того же типа, что и то исключение которое было сгенерировано в реальности) сначала "рядом" - то есть на той же уровне вложенности ,а затем уже снаружи - всё выше и выше по иерархии, пока "поиск" не достигнет внешнего блока try - и там уже в случае отсутствия обработчика будет обработан средой исполнения Явы (Java).
  2. Вложенность try может и не быть столь очевидной - ведь если вызывать методы, которые сами содержат try-блок внутри некоторого "внешнего" try-блок, то мы опять же получаем вложенность - и передача обработки "наверх" (в случае если её нет "рядом") полностью соответствует принципу описанному в предыдущем пункте.

Оператор throw

Исключение можно передать и в явном виде (не дожидаясь момента, когда оно "произойдёт"), для этого используется команда формата:

throw throwablevariable;

где throwablevariable - переменная (ссылка на объект) класса или подкласса Throwable.
Получить такую ссылку можно двумя способами:

  1. используя оператор catch
  2. используя оператор new

Замечания:

  1. после вызова throw поток исполнения программы останавливается и никакие последующие операторы не выполняются (ищется "ближайший" обработчик - то еть ближайший закрытый блок try, имеющий оператор catch с ожиданием исключения того типа, которое только что было сгенерировано оператором throw)
  2. Многие "встроенные" исключения времени выполнения в Java могут принимать в качестве параметра собственного конструктора строку, в которой можно передать текстовую информацию об исключении.

Ещё:

  1. Оператор throws
  2. Оператор finally
  3. Проверяемые и непроверяемые исключения
  4. создание собственных типов исключений
  5. Java сцепленные исключения описание
  6. Три новых средства для обработки исключений в JDK 7