Блоки перехвата исключения
Рис. 16.2. Сообщения обработки исключений
После первого запуска, при обычном ходе программы, выводятся все сообщения.
После второго запуска, приводящего к делению на нуль, управление сразу же передается в соответствующий блок catch(ArithmeticException ае) {}, потом выполняется то, что написано в блоке finally{}.
После третьего запуска управление после выполнения метода parseinto передается В другой блок catch(ArraylndexOutOfBoundsException arre){}, затем в блок finally{}.
Обратите внимание, что во всех случаях – и при обычном ходе программы, и после этих обработок – выводится сообщение "After all actions". Это свидетельствует о том, что выполнение программы не прекращается при возникновении исключительной ситуации, как это было в программе листинга 16.1, а продолжается после обработки и выполнения блока finally{}.
При записи блоков обработки исключений надо совершенно четко представлять себе, как будет передаваться управление во всех случаях. Поэтому изучите внимательно рис. 16.2.
Интересно, что пустой блок catch (){}, в котором между фигурными скобками нет ничего, даже пробела, тоже считается обработкой исключения и приводит к тому, что выполнение программы не прекратится. Именно так мы "обрабатывали" исключения в предыдущих главах.
Немного выше было сказано, что выброшенное исключение "пролетает" через всю программу. Что это означает? Изменим программу листинга 16.2, вынеся деление в отдельный метод f (). Получим листинг 16.3.
Листинг 16.3. Выбрасывание исключения из метода.
class SimpleExt2{ private static void f(int n){ System.out.println(" 10 / n = " + (10 / n)); } public static void main(String[] args){ try{ int n = Integer.parselnt(args[0]); System.out.println("After parselnt()); f (n); System.out.println("After results output"); }catch(SrithmeticException ae){ System.out.println("From Arithm.Exc .catch: "+ae); }catch(ArraylndexQutOfBoundsException arre){ System.out.println("From Array.Exc .catch: "+arre); }finally{ System,out.println("From finally"); } System.out.println("After all actions"); } }
Откомпилировав и запустив программу листинга 16.3, убедимся, что вывод программы не изменился, он такой же, как на рис. 16.2. Исключение, возникшее при делении на нуль в методе f (), "пролетело" через этот метод, "вылетело" в метод main (), там перехвачено и обработано.