АБОБА. Справочник по программированию на Java Методическое пособие
Скачать 242.41 Kb.
|
throwsЕсли метод может породить исключение, которое он сам не обрабатывает, он должен специфицировать это поведение так, чтобы вызывающий его код мог позаботиться об этом исключении. Это делается добавлением к объявлению метода конструкции throws. Конструкция throws перечисляет типы исключений, которые метод может возбуждать. Это необходимо для всех исключений, кроме имеющих тип Error, RuntimeException либо их подклассов. Все остальные исключения, которые может возбуждать метод, должны быть объявлены в конструкции throws. Если этого не сделать, получится ошибка во время компиляции. Вот общая форма объявления метода, которая включает оператор throws: тип имя_метода(список_параметров) throws список_исключений { // тело метода } Здесь список_исключений – это разделенный запятыми список исключений, которые метод может возбуждать. finallyКогда исключение возбуждено, выполнение метода направляется по нелинейному пути, изменяющему нормальный поток управления внутри метода. В зависимости от того, как закодирован метод, существует даже возможность преждевременного возврата управления. В некоторых методах это может служить причиной серьезных проблем. Например, если метод при входе открывает файл и закрывает его при выходе, вероятно, вы не захотите, чтобы выполнение кода, закрывающего файл, было пропущено из-за применения механизма обработки исключений. Ключевое слово finally предназначено для того, чтобы справиться с такой ситуацией. finally создает блок кода, который будет выполнен после завершения блока try/catch, но перед кодом, следующим за try/catch. Блок finally выполняется независимо от того, возбуждено исключение или нет. Если исключение возбуждено, блок finally выполняется, даже если ни один оператор catch этому исключению не соответствует. В любой момент, когда метод собирается возвратить управление вызывающему коду изнутри блока try/catch – из-за необработанного исключения, или явным применением оператора return – блок finally будет выполнен перед возвратом управления из метода. Это может быть удобно для закрытия файловых дескрипторов либо освобождения других ресурсов, которые были получены в начале метода и должны быть освобождены перед возвратом. Оператор finally необязателен. Однако каждый оператор try требует наличия, по крайней мере, одного оператора catch или finally. Ниже приведен пример программы, которая показывает три метода, возвращающих управление разными способами, но ни один из них не пропускает выполнения блока finally. class FinallyDemo { // Возбуждает исключение из метода. static void procA() { try { System.out.println("внутри procA"); throw new RuntimeException("демо"); } finally { System.out.println("блок finally procA"); } } // Возврат управления в блоке try. static void procB() { try { System.out.println("внутри procB"); return; } finally { System.out.println("блок finally procB"); } } // Нормальное выполнение блока try. static void procC() { try { System.out.println("внутри procC"); } finally { System.out.println("блок finally procC"); } } public static void main(String args[]) { try { procA(); } catch (Exception e) { System.out.println("Исключение перехвачено"); } procB(); procC(); }} В этом примере procA() преждевременно прерывает выполнение в блоке try, возбуждая исключение. Блок finally все равно выполняется. В procB() возврат управления осуществляется в блоке try оператором return. Блок finally выполняется перед возвратом из procB(). В procC() блок try выполняется нормально, без ошибок. Однако блок finally выполняется все равно. Встроенные исключения JavaВнутри стандартного пакета java.lang определено несколько классов исключений. Некоторые из них использовались в предшествующих примерах. Наиболее общие из этих исключений являются подклассами стандартного типа RuntimeException. Как уже объяснялось ранее, эти исключения не нужно включать в список throws метода – они называются непроверяемыми исключениями, поскольку компилятор не проверяет факт обработки или возбуждения методом таких исключений. Создание собственных подклассов исключенийХотя встроенные исключения Java обрабатывают большинство частых ошибок, вероятно, вам потребуется создать ваши собственные типы исключений для обработки ситуаций, специфичных для ваших приложений. Это достаточно просто сделать: просто определите подкласс Exception (который, разумеется, является подклассом Throwable). Ваши подклассы не обязаны реализовывать что-либо – важно само их присутствие в системе типов, которое позволит использовать их как исключения. Класс Exception не определяет никаких собственных методов. Естественно, он наследует методы, представленные в Throwable. Таким образом, всем исключениям, включая те, что вы создадите сами, доступны методы, определенные в Throwable. Exception определяет четыре конструктора. Два были добавлены в JDK 1.4 для поддержки цепочек исключений. |