АБОБА. Справочник по программированию на Java Методическое пособие
Скачать 242.41 Kb.
|
Вложенные операторы tryОператоры try могут быть вложенными. То есть оператор try может находиться внутри блока другого try. Всякий раз, когда управление попадает в блок try, контекст этого исключения заталкивается в стек. Если вложенный оператор try не имеет обработчика catch для определенного исключения, стек “раскручивается” и проверяются на соответствие обработчики catch следующего (внешнего) блока try. Это продолжается до тех пор, пока не будет найден подходящий оператор catch либо пока не будут проверены все уровни вложенных try. Если подходящий оператор catch не будет найден, то исключение обработает система времени выполнения Java. Ниже приведен пример, в котором используются вложенные операторы try. // Пример вложенных операторов try. class NestTry { public static void main(String args[]) { try { int a = args.length; /* Если не указаны параметры командной строки, следующий оператор сгенерирует исключение деления на ноль. */ int b = 42 / a; System.out.println("a = " + a); try { // вложенный блок try /* Если используется один аргумент командной строки, то исключение деления на ноль будет сгенерировано следующим кодом. */ if(a==1) a = a/(a-a); // деление на ноль /* Если используется два аргумента командной строки, то генерируется исключение выхода за пределы массива. */ if(a==2) { int c[] = { 1 }; c[42] = 99; // генерируется исключение выхода за пределы массива } } catch(ArrayIndexOutOfBoundsException e) { System.out.println("Индекс за пределами массива: " + e); } } catch(ArithmeticException e) { System.out.println("Деление на 0: " + e); } }} throwДо сих пор мы перехватывали только исключения, которые возбуждала система времени выполнения Java. Однако существует возможность возбуждать исключения из ваших программ явным образом, используя оператор throw. Его общая форма показана ниже: throw экземпляр_Throwable; Здесь экземпляр_Throwable должен быть объектом типа Throwable либо подклассом Throwable. Примитивные типы – такие, как int или char, как и классы, отличные от Throwable, например String и Object, не могут быть использованы для исключений. Существуют два способа получить объект Throwable: с использованием параметра в операторе catch либо созданием объекта оператором new. Поток выполнения останавливается непосредственно после оператора throw – любые последующие операторы не выполняются. Обнаруживается ближайший закрытый блок try, имеющий оператор catch соответствующего исключению типа. Если соответствие найдено, управление передается этому оператору. Если же нет, проверяется следующий внешний блок try и т.д. Если не находится подходящего по типу оператора catch, то обработчик исключений по умолчанию прерывает программу и печатает трассировку стека. Ниже приведен пример программы, создающей и возбуждающей исключение. Обработчик, который перехватывает его, повторно возбуждает его для внешнего обработчика. // Демонстрация применения throw. class ThrowDemo { static void demoproc() { try { throw new NullPointerException("demo"); } catch(NullPointerException e) { System.out.println("Перехвачено внутри demoproc."); throw e; // повторно возбудить исключение } } public static void main(String args[]) { try { demoproc(); } catch(NullPointerException e) { System.out.println("Повторный перехват: " + e); } }} Эта программа получает два шанса обработки одной и той же ошибки. Во-первых, main() устанавливает контекст исключения, затем вызывает demoproc(). Метод demoproc() устанавливает другой контекст обработки исключения и немедленно возбуждает новый экземпляр исключения NullPointerException, который перехватывается в следующей строке. Затем исключение возбуждается повторно. Ниже показан результирующий вывод. Перехвачено внутри demoproc. Повторныйперехват: java.lang.NullPointerException: demo Эта программа также демонстрирует, как создавать собственные объекты стандартных исключений Java. Обратите внимание на строку: throw new NullPointerException("demo"); Здесь операция new используется для конструирования экземпляра NullPointerException. Многие их встроенных исключений времени выполнения Java имеют, по меньшей мере, два конструктора: один без параметров и один со строковым параметром. Когда применяется вторая форма, аргумент указывает строку, описывающую исключение. Эта строка отображается, когда объект используется в качестве аргумента print() или println(). Она также может быть получена вызовом метода getMessage(), который определен в Throwable. |