Простой пример обработки исключений Java
Исключения Java 6 октября, 2015Рассмотрим простой пример, демонстрирующий перехват и обработку исключения. Как известно, попытка обратиться за границы массива приводит к ошибке, и виртуальная машина Java генерирует соответствующее исключение ArrayindexOutOfBoundsException.
Ниже приведен код программы, в которой намеренно создаются условия для появления данного исключения, которое затем перехватывается.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Демонстрация обработки исключений class ExcDemol { public static void main(String args) { int nums[] = new int[4]; try { System.out.println("Дo генерации исключения"); nums[10] = 300; System.out.println("Этa строка не будет отображаться"); } catch(ArrayIndexOutOfBoundsException ехс) { System.out.println("Bыxoд за границы массива!"); } System.out.println("Пocлe оператора catch"); } } |
Результат выполнения данной программы выглядит следующим образом:
1 2 3 |
До генерации исключения Выход за границы массива! После оператора catch |
Несмотря на всю простоту данного примера программы, он наглядно демонстрирует несколько важных особенностей обработки исключений. Во-первых, контролируемый код помещается в блок try. И во-вторых, когда возникает исключение (в данном случае это происходит при попытке использования индекса, выходящего за границы массива), выполнение блока try прерывается и управление получает блок catch.
Следовательно, явного обращения к блоку catch не происходит, но переход к нему осуществляется лишь при определенном условии, возникающем в ходе выполнения программы. Так, оператор вызова метода println(), следующий за выражением, в котором происходит обращение к несуществующему элементу массива, вообще не может быть выполнен.
При выходе из блока catch выполнение программы продолжается с оператора, следующего за этим блоком. Таким образом, обработчик исключений предназначен для устранения программных ошибок, приводящих к исключительным ситуациям, а также для обеспечения нормального продолжения выполняемой программы.
Как упоминалось выше, в отсутствие появления исключений в блоке try операторы в блоке catch управления не получают, и выполнение программы продолжается послеблока catch. Для того чтобы убедиться в этом, замените в предыдущей программе строку кода:
1 |
nums[10] = 300; |
следующей строкой:
1 |
nums[0] = 300; |
Теперь исключение не возникнет и блок catch не выполнится.
Важно понимать, что исключения отслеживаются во всем коде, находящемся в блоке try. Это относится и к исключениям, которые могут быть сгенерированы методом, вызываемым из блока try.
Исключения, возникающие в вызываемом методе, перехватываются операторами в блоке catch, связанном с блоком try. Правда, это произойдет лишь в том случае, если метод не обрабатывает исключения самостоятельно. Рассмотрим в качестве примера следующую программу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/* Исключение может быть сгенерировано одним методом, а перехвачено другим */ class ExcTest { // Генерация исключения static void genException() { int nums[] = new int[4]; System.out.println("Дo генерации исключения"); // Сгенерировать исключение в связи с // выходом индекса за границы массива nums[7] = 10; System.out.println("Этa строка не будет отображаться"); } } class ExcDemo2 { public static void main (String args []) { try { ExcTest.genException(); } // А здесь исключение перехватывается catch (ArrayIndexOutOfBoundsException ехс) { System.out.println("Bыxoд за границы массива!"); } System.out.println("Пocлe оператора catch"); } } |
Выполнение этой версии программы дает тот же результат, что и предыдущая версия.
Метод genException() вызывается из блока try, и поэтому генерируемое, но не перехватываемое в нем исключение перехватывается далее в блоке catch, находящемся в методе main(). Если бы метод genException() сам перехватывал исключение, оно вообще не достигло бы метода main().
Recent Comments