Главная » Java » try, catch и finally Java

0

Исключения могут быть отловлены, если требуемый фрагмент кода заключить в блок try, синтаксис которого выглядит так:

try {

ИНСТРУКЦИИ

} catch (типисключенияl идентификаторl) { ИНСТРУКЦИИ

} catch (типисключения2 идентификатор2) { ИНСТРУКЦИИ

} finally { ИНСТРУКЦИИ

}

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

Если в конструкции try присутствует предложение finallу, его код выполняется по завершении работы остальных фрагментов кода try. Это происходит независимо от того, каким образом протекал процесс вычислений – успешно, с выбрасыванием исключения либо с передачей управления посредством команды return или break.

Ниже приведен пример, который иллюстрирует прием обработки одного из исключений, генерируемых’ методом replaceValuе.

Object value = new Integer(8);

try {

аttгibutеdObj.герlасеVаluе("возраст", value);

} catch (NoSuchAttributeException е) {

// Произойти не должно, но если все-таки это случится,

 // добавим отсутствующий атрибут и присвоим ему значение

 Attr attr = new Attr(e.attrName, value);

attributedObj.add(attr);

}

Конструкция try заключает в себе блок кода, выполняющий определенные операции, которые, как можно ожидать, при нормальных обстоятельствах должны быть осуществлены успешно. Если все действительно благополучно, блок завершается. Если же во время выполнения кода блока try выбрасывается  – либо непосредственно, командой throw, либо косвенно, при вызове какого-либо метода, – работа блока try прекращается. Затем система проверяет, способно ли какое-либо из присоединенных к try предложений catch обработать выброшенное исключение.

Предложение catch чем-то напоминает "встроенный" метод, обладающий единственным параметром типа исключения, подлежащего обработке. Код catch способен выполнить некие восстановительные операции, выбросить собственное исключение, вручая полномочия по обработке ошибки внешнему коду, либо осуществить все необходимое, а затем передать управление инструкции, следующей за try (после выполнения кода блока finallу, если таковой имеется).

Задание в предложении catch параметра, относящегося к общему типу исключений (такому, например, как Exception), – это обычно не очень правильный выбор, поскольку такое предложение способно отлавливать любые исключения, а не только те, которые относятся к исключениям производных типов, рассматриваемым в конкретной ситуации. Если применить подобное решение в нашем примере, оно способно привести к тому, что вместо интересующего нас исключения типа NoSuchAttributeException прежде может быть отловлено какое-либо другое, например ClasscastExcepton.

Предложение catch, содержащее в качестве параметра один из базовых типов исключений, не может быть расположено перед теми catch, в которых заданы соответствующие производные типы. Предложения catch просматриваются системой поочередно, поэтому размещение в начале последовательности тех из них, которые относятся к базовым типам, воспрепятствует передаче управления остальным: первым достанется "все", а последним – ничего. Следующий при мер кода откомпилирован не будет:

class superException extends Exception { // Базовый класс исключений

}

class SubException extends SuperException { / / производный класс исключений

class BadCatch {

public void goodTry() {

// последовательность предложений catch неверна try {

throw new subException();

} catch (SuperException superRef) {

// Ловит и superException, и SubException

} catch (SubException subRef) {

// Код недостижим

}

}

}

При каждом старте приложения конкретный блок try может сгенерировать только Одно исключение. Если в предложениях catch или finallу выбрасываются Другие исключения, предложения catch текущей конструкции try заново не проверяются. (Предложения саtch и finallу как таковые находятся за пределами фрагмента кода, защищенного блоком try.) Разумеется, ничто не запрещает обработать такие исключения с помощью вложенных Конструкций try … catch … finally.

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

По теме:

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