Мульти-исключения в Java: перехват нескольких исключений в одном catch блоке
Мастерство мульти-исключений в Java
Узнайте, как перехватывать несколько исключений одним catch блоком, упрощать код и избегать распространенных ошибок.
До Java 7 разработчикам приходилось писать отдельные блоки catch для каждого типа исключения, даже когда логика обработки была идентичной.
Рассмотрим следующий сценарий.
Пример 1: Отдельные catch блоки
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (ArithmeticException e) { System.out.println(e.getMessage()); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
Вывод:
/ by zero
В этом примере могут возникнуть две различные проблемы:
ArithmeticException— деление на ноль.ArrayIndexOutOfBoundsException— доступ к индексу 10 в 10-элементном массиве.
Оба блока catch выполняют одно и то же действие, приводя к дублированию кода.
Перехват нескольких исключений в одном блоке
Начиная с Java SE 7, вы можете объединить несколько типов исключений в один блок catch с помощью разделителя pipe (|).
Синтаксис:
try { // код } catch (ExceptionType1 | ExceptionType2 ex) { // обработчик }
Пример 2: Multi-catch блок
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
Вывод:
/ by zero
Объединяя обработчики, код становится чище, байт-код меньше, а поддержка проще.
Примечание: В multi-catch параметр неявно final, поэтому вы не можете переназначить его.
Использование базового класса исключения
Если несколько перехватываемых исключений имеют общего предка, вы можете перехватить этот предок вместо перечисления каждого подкласса.
Пример 3: Перехват базового класса Exception
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (Exception e) { System.out.println(e.getMessage()); } } }
Вывод:
/ by zero
Поскольку каждое конкретное исключение в Java расширяет Exception, этот единственный catch блок обрабатывает все вышеуказанные сценарии.
Если базовое исключение уже перехвачено, включение его подклассов в тот же catch вызовет ошибку компиляции.
Пример 4: Недопустимое сочетание базового и дочерних исключений
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
Вывод:
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
Эта ошибка возникает, потому что ArithmeticException и ArrayIndexOutOfBoundsException являются подклассами Exception, нарушая правило языка.
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Обработка исключений в Java: try-catch-finally и try-with-resources
- Java throw vs throws: мастерство обработки исключений с практическими примерами
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры