Урок 18

Оператор catch


1. Применение нескольких операторов catch

В некоторых случаях один фрагмент кода может инициировать более одного исключения. Используется два или более операторов catch, каждый для перехвата своего типа исключений. Когда возбуждается исключение, каждый оператор catch проверяется по порядку, и первый из них, чей тип соответствует исключению, выполняется. После того, как выполнится один из операторов catch, все остальные пропускаются, и выполнение программы продолжается с места, следующего за блоком try/catch.

Пример 1. Применение нескольких операторов catch

public class MultiCatch {
    public static void main(String[] args) {
        try {
            int a = args.length;
            int b = 42 / a;
            int[] c = new int[a];
            c[a] = 6;
        } catch (ArithmeticException e) {
            System.out.println("Деление на ноль." + e);
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }
        System.out.println("Уже после блока try-catch-catch.");
    }
}

Когда используются множественные операторы catch, важно помнить, что подклассы исключений должны следовать перед любыми их суперклассами. Это потому, что оператор catch, который использует суперкласс, будет перехватывать все исключения этого суперкласса плюс всех его подклассов. То есть подкласс исключения никогда не будет обработан, если вы попытаетесь его перехватить после его суперкласса. Более того, в Java недостижимый код является ошибкой.

Пример 2. Применение нескольких операторов catch

public class SuperSubCatch {
    public static void main(String[] args) {
        try {
            int a = 0;
            int b = 42 / a;
        } catch (Exception e) {
            System.out.println("Перехват исключений общего класса Exception.");
        } /*catch (ArithmeticException e) {
            //ОШИБКА: недостижимый код !
            System.out.println("Этoт код вообще недостижим.");
        }*/
    }
}

2. Объявление нескольких исключений в одном блоке catch (multi-catch блок)

Было:

try {
  ...
} catch(IllegalStateException e){
  System.out.println(e.getMessage());
} catch(SQLException e){
  System.out.println(e.getMessage());
} catch(ContextException e){
  System.out.println(e.getMessage());
}
Стало после Java 7:
try {
  ...
} catch(IllegalStateException | SQLException | ContextException e){
   System.out.println(e.getMessage());
}

Пример 3. Использование multi-catch блока

public class MultiCatch2 {
    public static void main(String[] args) {
        try {
            int a = args.length;
            int b = 42 / a;
            int[] c = new int[a];
            c[a] = 6;
        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("Ошибка." + e);
        }
        System.out.println("Уже после блока try-catch.");
    }
}

Параметр оператора catch должен быть фактически завершенным (effective final). Это означает, что ему нельзя присваивать новое значение в блоке оператора catch или же он должен быть явно объявлен как final.

Multi-catch block может содержать только исключения не входящие в одну иерархию.



0 comments
Leave your comment: