Оператор throw
Этот оператор очень прост: после слова throw через пробел записывается объект класса-исключения. Достаточно часто он создается прямо в операторе throw, например:
throw new ArithmeticException();
Оператор можно записать в любом месте программы. Он немедленно выбрасывает записанный в нем объект-исключение и дальше обработка этого исключения идет как обычно, будто бы здесь произошло деление на нуль или другое действие, вызвавшее исключение класса ArithmeticException.
Итак, каждый блок catch () и перехватывает один определенный тип исключений. Если требуется одинаково обработать несколько типов исключений, то можно воспользоваться тем, что классы-исключения образуют иерархию. Изменим еще раз листинг 16.2, получив листинг 16.5.
Листинг 16.5. Обработка нескольких типов исключений.
class SimpleExt4( public static void main(String[] args){ try{ int n = Integer.parselnt(args[0]); System.out.println("After parselnt()); System.out.println(" 10 / n = " + (10 / n)); System.out.println("After results output"); }catch(RuntimeException ae){ System.out.println("From Run.Exc .catch: "+ae); }finally{ System.out.println("From finally"); } System.out.println("After all actions"); } }
В листинге 16.5 два блока catch() {} заменены одним блоком, перехватывающим исключение класса RuntimeException. Как видно на рис. 16.4, этот блок перехватывает оба исключения. Почему? Потому что это исключения подклассов класса RuntimeException.
Рис. 16.4. Перехват нескольких типов исключений
Таким образом, перемещаясь по иерархии классов-исключений, мы можем обрабатывать сразу более или менее крупные совокупности исключений. Рассмотрим подробнее иерархию классов-исключений.