У цьому підручнику ми навчимося обробляти кілька винятків у 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
класу. Отже, ми отримуємо помилку компіляції.