Java ловить кілька винятків

У цьому підручнику ми навчимося обробляти кілька винятків у Java за допомогою прикладів.

До Java 7 нам доводилося писати кілька кодів обробки винятків для різних типів винятків, навіть якщо була надлишковість коду.

Візьмемо приклад.

Приклад 1: Кілька блоків лову

 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()); ) ) ) 

Вихідні дані

 / за нулем 

У цьому прикладі можуть бути два винятки:

  • ArithmeticException тому що ми намагаємось розділити число на 0.
  • ArrayIndexOutOfBoundsException оскільки ми оголосили новий цілочисельний масив з межами масиву від 0 до 9, і ми намагаємося присвоїти значення індексу 10.

Ми роздруковуємо повідомлення про винятки в обох catchблоках, тобто дублікат коду.

Асоціативність оператора присвоєння =справа наліво, тому спочатку ArithmeticExceptionкидається повідомлення з повідомленням / на нуль.

Обробляйте кілька винятків у блоці catch

У Java SE 7 і пізніших версіях ми тепер можемо вловити більше одного типу винятків в одному catchблоці.

Кожен тип винятків, який може бути оброблений catchблоком, відокремлюється за допомогою вертикальної планки або труби |.

Його синтаксис:

 try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block ) 

Приклад 2: Блок мульти-лову

 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()); ) ) ) 

Вихідні дані

 / за нулем 

Вловлювання кількох винятків в одному catchблоці зменшує дублювання коду та підвищує ефективність.

Байт-код, сформований під час компіляції цієї програми, буде меншим, ніж програма, що має кілька catchблоків, оскільки відсутній надмірність коду.

Примітка: Якщо catchблок обробляє кілька винятків, параметр catch є неявним final. Це означає, що ми не можемо призначати будь-які значення для лову параметрів.

Виняток лову бази

При лові декількох винятків в одному catchблоці правило узагальнюється на спеціалізоване.

Це означає, що якщо в catchблоці існує ієрархія винятків , ми можемо зловити базовий виняток лише замість того, щоб ловити кілька спеціалізованих винятків.

Візьмемо приклад.

Приклад 3: Ловити лише базовий клас винятків

 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()); ) ) ) 

Вихідні дані

 / за нулем 

Ми знаємо, що всі класи винятків є підкласами Exceptionкласу. Отже, замість того, щоб ловити кілька спеціалізованих винятків, ми можемо просто зловити 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: помилка: Альтернативи в операторі multi-catch не можуть бути пов’язані підкласом 

У цьому прикладі ArithmeticExceptionі ArrayIndexOutOfBoundsExceptionє обидва підкласи Exceptionкласу. Отже, ми отримуємо помилку компіляції.

Цікаві статті...