Иллюстрированный самоучитель по Java

Блоки перехвата исключения

Иллюстрированный самоучитель по Java › Обработка исключительных ситуаций › Блоки перехвата исключения
Рис. 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 (), там перехвачено и обработано.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.