> int c[] = { 1 };
> c[42] = 99;
>}
>catch (ArithmeticException e) {
> System.out.println("деление на ноль: " + e);
>}
>catch(ArrayIndexOutOfBoundsException e) {
> System.out.println("неправильный индекс массива: " + e);
>}
>}
Этот пример, запущенный без параметров, вызывает возбуждение исключительной ситуации деления на ноль. Если же мы зададим в командной строке один или несколько параметров, тем самым установив переменную «а» в значение больше нуля, наш пример выполнит оператор деления, но в следующем операторе будет возбуждено исключение выхода индекса за границы массива ArraylndexOutOfBounds. Ниже приведены результаты работы этой программы, запущенной и тем и другим способом.
>C:\> java MultiCatch
>a = 0
>div by 0: java.lang. ArithmeticException: / деление на ноль
>C:\> java MultiCatch 1
>a= 1
>неправильный индекс массива: java.lang.ArrayIndexOutOffloundsException: 42
9.6. Вложенные операторы try
Операторы try можно вкладывать друг в друга аналогично тому, как можно создавать вложенные области видимости переменных. Если у оператора try низкого уровня нет раздела catch, соответствующего возбужденному исключению, то в поисках подходящего обработчика будут проверены разделы catch внешнего оператора try. Вот пример, в котором два оператора try вложены друг в друга посредством вызова метода.
>class MultiNest {
>static void procedure() {
>try {
> int c[] = { 1 };
> c[42] = 99;
>}
>catch(ArrayIndexOutOfboundsException e) {
> System.out.println("неправильный индекс массива: " + e);
>}
>}
>public static void main(String args[]) {
>try {
> int a = args.length();
> System.out.println("a = " + a);
> int b = 42 / a;
> procedure();
>}
>catch (ArithmeticException e) {
> System.out.println("деление на ноль: " + e);
>}
}
}
9.7. Оператор throw
Оператор throw используется для возбуждения исключения «вручную». Для того чтобы сделать это, нужно иметь объект подкласса класса Throwable, который можно либо получить как параметр оператора catch, либо создать с помощью оператора new. Ниже приведена общая форма оператора throw,
throw ОбъектТипа Throwable;
При достижении этого оператора нормальное выполнение кода немедленно прекращается, так что следующий за ним оператор не выполняется. Ближайший окружающий блок try проверяется на наличие соответствующего возбужденному исключению обработчика catch. Если такой отыщется, управление передается ему. Если нет, то проверяется следующий из вложенных операторов try и так до тех пор, пока либо не будет найден подходящий раздел catch, либо обработчик исключений исполняющей системы Java не остановит программу, выведя при этом состояние стека вызовов. Ниже приведен пример, в котором сначала создается объект-исключение, затем оператор throw возбуждает исключительную ситуацию, после чего то же исключение возбуждается повторно — на этот раз уже кодом перехватившего его в первый раз раздела catch.
>class ThrowDemo {
>static void demoproc() {
{
> throw new NullPointerException("demo");
>}
>catch (NullPointerException e) {
> System.out.println("caught inside demoproc");
> throw e;
>}
>}
>public static void main(String args[]) {
>try {
> demoproc();
>}
>catch(NulPointerException e) {
> System.out.println("recaught:" + e);
>}
}
>}
В этом примере обработка исключения проводится в два приема. Метод main создает контекст для исключения и вызывает demoproc. Метод demoproc также устанавливает контекст для обработки исключения, создает новый объект класса NullPointerException и с помощью оператора throw возбуждает это исключение. Исключение перехватывается в следующей строке внутри метода demoproc, причем объект-исключение доступен коду обработчика через параметр «е». Код обработчика выводит сообщение о том, что возбуждено исключение, а затем снова возбуждает его с помощью оператора throw, в результате чего оно передается обработчику исключений в методе main. Ниже приведен результат, полученный при запуске этого примера.
>С:\> java ThrowDemo
>caught inside demoproc
>recaught: java.lang.NullPointerException: demo