Простой пример обработки исключений JavaРассмотрим простой пример, демонстрирующий перехват и обработ­ку исключения. Как известно, попытка обратиться за границы массива приво­дит к ошибке, и виртуальная машина Java генерирует соответствующее исключение ArrayindexOutOfBoundsException.

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

Результат выполнения данной программы выглядит следующим образом:

Несмотря на всю простоту данного примера программы, он наглядно демонстрирует несколько важных особенностей обработки исключений. Во-первых, контролируемый код помещается в блок try. И во-вторых, когда возникает исключение (в данном случае это происходит при попытке использования индекса, выходящего за границы массива), выполнение блока try прерывается и управление получает блок catch.

Следовательно, явного обращения к блоку catch не происходит, но переход к нему осуществляется лишь при определенном условии, возникающем в ходе выполнения программы. Так, оператор вызова метода println(), следующий за выражением, в котором происходит обращение к несуществующему элементу массива, вообще не может быть выполнен.

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

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

следующей строкой:

Теперь исключение не возникнет и блок catch не выполнится.

Важно понимать, что исключения отслеживаются во всем коде, находящемся в бло­ке try. Это относится и к исключениям, которые могут быть сгенерированы методом, вызываемым из блока try.

Исключения, возникающие в вызываемом методе, перехва­тываются операторами в блоке catch, связанном с блоком try. Правда, это произойдет лишь в том случае, если метод не обрабатывает исключения самостоятельно. Рассмо­трим в качестве примера следующую программу.

Выполнение этой версии программы дает тот же результат, что и предыдущая версия.

Метод genException() вызывается из блока try, и поэтому генерируемое, но не пе­рехватываемое в нем исключение перехватывается далее в блоке catch, находящемся в методе main(). Если бы метод genException() сам перехватывал исключение, оно во­обще не достигло бы метода main().