English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы будем использовать примеры, чтобы изучить, как обрабатывать несколько исключений в Java.
До Java 7, даже если существует избыточный код, мы должны писать несколько обработчиков исключений для различных типов исключений.
Давайте приведем пример.
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.
В Java SE 7 и выше мы можем ловить несколько типов исключений в одном блоке catch.
Каждый тип исключения, которое можно обработать в блоке catch, разделен вертикальной чертой (|).
Грамматика:
try { // code } // catch block }
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 существует иерархия исключений, мы можем ловить только базовые исключения, а не несколько специальных исключений.
Давайте приведем пример.
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 уже указан базовый класс исключений, не используйте в этом же блоке подклассы исключений. В противном случае, мы получим компиляционную ошибку.
Давайте приведем пример.
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. Таким образом, мы вызываем компиляционную ошибку.