English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Управление потоком

Java Массивы

Java Ориентированный на объекты (I)

Java Ориентированный на объекты (II)

Java Ориентированный на объекты (III)

Обработка исключений Java

Java Списки (List)

Java Queue (очередь)

Java Map-сборники

Java Set-сборники

Java Ввод/вывод (I/O)

Java Reader/Writer

Другие темы Java

Java捕获和处理多个异常

В этом руководстве мы будем использовать примеры, чтобы изучить, как обрабатывать несколько исключений в Java.

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

Давайте приведем пример.

Пример 1: Множественные блоки ловли

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    }
      System.out.println(e.getMessage());
    }
      System.out.println(e.getMessage());
    } 
  }
}

Результат вывода

/ by zero

В данном примере могут произойти два исключения:

  • ArithmeticException - 因为我们 пытаемся разделить число на ноль.

  • ArrayIndexOutOfBoundsException - 因为我们 уже объявили новый массив целых чисел, границы массива от 0 до 9, и мы пытаемся присвоить значение индексу 10.

Мы выводим сообщение об исключении в обоих блоках catch, что является дублированием кода.

Ассоциативность оператора присваивания (=) слева направо, поэтому сначала ArithmeticException выбрасывается с сообщением / by zero.

Обработка нескольких исключений в блоке catch

В Java SE 7 и выше мы можем ловить несколько типов исключений в одном блоке catch.

Каждый тип исключения, которое можно обработать в блоке catch, разделен вертикальной чертой (|).

Грамматика:

try {
  // code
} 
  // catch block
}

Пример 2: Ловить несколько исключений в одном блоке catch

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    }
      System.out.println(e.getMessage());
    }
  }
}

Результат вывода

/ by zero

Ловля нескольких исключений в одном блоке catch может уменьшить дублирование кода и повысить эффективность.

При компиляции программы生成的 байт-код будет меньше, чем у программы с несколькими блоками catch, так как нет кода избыточности.

Обратите внимание:Если блок catch обрабатывает несколько исключений, параметр catch является implicit final. Это означает, что мы не можем присваивать любому значению параметр ловли.

Ловить базовый исключение

Когда в одном блоке catch ловятся несколько исключений, это правило обобщается в специальное правило.

Это означает, что если в блоке catch существует иерархия исключений, мы можем ловить только базовые исключения, а не несколько специальных исключений.

Давайте приведем пример.

Пример 3: Ловить только базовый класс исключений

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    }
      System.out.println(e.getMessage());
    }
  }
}

Результат вывода

/ by zero

Мы знаем, что все классы исключений являются подклассами класса Exception. Поэтому нам не нужно ловить несколько специальных исключений, а достаточно ловить класс Exception.

Если в блоке catch уже указан базовый класс исключений, не используйте в этом же блоке подклассы исключений. В противном случае, мы получим компиляционную ошибку.

Давайте приведем пример.

Пример 4: захват базового класса и класса-дочери异常

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    }
      System.out.println(e.getMessage());
    }
  }
}

Результат вывода

Main.java:6: ошибка: Возможности в многооператорном блоке перехвата не могут быть связаны через наследование

В этом примере, ArithmeticException и ArrayIndexOutOfBoundsException являются подклассами класса Exception. Таким образом, мы вызываем компиляционную ошибку.