<< ПредыдущаяОглавлениеСледующая >>


9.4. Операторы try и catch

Для задания блока программного кода, который требуется защитить от исключений, используется ключевое слово try. Сразу же после try-блока помещается блок catch, задающий тип исключения, которое вы хотите обрабатывать.

class Ехс2 {
public static void main(String args[]) {
try {
       int d = 0;
       int a = 42 / d;
}
catch (ArithmeticException e) {
      System.out.println("деление на ноль");
}
}
}

Целью большинства хорошо сконструированных catch-разделов должна быть обработка возникшей исключительной ситуации и приведение переменных программы в некоторое разумное состояние — такое, чтобы программу можно было продолжить, будто никакой ошибки и не было (в нашем примере выводится предупреждение - «деление на ноль»).

9.5. Несколько разделов catch

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

class MultiCatch {
public static void main(String args[]) {
try {
     int a = args.length;
       System.out.println("a = " + a);
       int b = 42 / a;
       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);
}
}
}

 



<< ПредыдущаяОглавлениеСледующая >>