Винятки, throwable, exception

У даній статті розглядається використовуваний в Java механізм обробки виключень. Виняток в Java - це об'єкт, який описує винятковий стан, що виникло в якій-небудь ділянці програмного коду. Коли виникає виключне стан, створюється об'єкт класу Exception. Цей об'єкт пересилається в метод, що обробляє даний тип виняткової ситуації. Винятки можуть порушуватися і для того, щоб повідомити про деякі нештатні ситуації.

Механізм виняткових ситуацій в Java підтримується п'ятьма ключовими словами:

Нижче наведена загальна форма блоку обробки винятків.

У вершині ієрархії виключень коштує клас Throwable. який успадковується від Object. Кожен з типів винятків є підкласом Throwable. Два безпосередніх спадкоємця класу Throwable ділять ієрархію підкласів виключень на дві різні гілки. Ієрархія класів представлена ​​на малюнку.

Винятки, throwable, exception

Клас Ехception використовується для опису виняткових ситуації, які повинні перехоплюватися програмним кодом користувача. Клас Error призначений для опису виняткових ситуацій, які при звичайних умовах не повинні перехоплюватися в призначеній для користувача програмі.

Об'єкти-виключення автоматично створюються виконуючою середовищем Java в результаті виникнення певних виняткових ситуацій. Приклад програми, в якій створюємо виняткову ситуацію при розподілі на нуль.

В консоль буде виведено наступне повідомлення.

Слід звернути увагу на той факт, що типом порушеної виключення не була Exception і не Throwable. Це підклас класу Exception. а саме: ArithmeticException. що пояснює, яка помилка виникла при виконанні програми.

Змінимо клас додаванням статичного методу subroutine. в якому створимо таку ж виняткову ситуацію.

Повідомлення виконання програми показує, як обробник виключень виконуючої системи Java виводить вміст всього стека викликів.

Для захисту програмного коду від винятків необхідно використовувати пов'язані блоки з ключовими словами try catch; catch поміщається відразу ж після try-блоку. У блоці catch задається тип виключення, яке необхідно обробити.

Метою більшості добре сконструйованих catch -Розділ повинна бути обробка виникла виняткової ситуації та приведення змінних програми в деякий розумний стан - таке, щоб програму можна було продовжити так, ніби ніякої помилки і не було (в нашому прикладі виводиться попередження - division by zero).

Кілька розділів catch

В окремих випадках блок програмного коду може викликати виключення різних типів. Для того, щоб локалізувати обробку подібних ситуацій, можна використовувати кілька catch -Розділ для одного try-блоку. Блоки найбільш спеціалізованих класів винятків повинні йти першими, оскільки жоден підклас не буде досягнутий, якщо поставити його після суперкласу.

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

Даний приклад, запущений без параметрів, викликає збудження виняткової ситуації ділення на нуль. Якщо в командному рядку буде визначено один або кілька параметрів, тим самим встановивши 'а' в значення більше нуля, то буде порушено виняток виходу індексу за межі масиву ArrayIndexOutOfBounds. Нижче наведені результати роботи цієї програми, запущеної і тим і іншим способом.

Вкладені оператори try

Оператори try можна вкладати один в одного. Якщо у оператора try низького рівня немає розділу catch. відповідного порушеній виключенню, стек буде розгорнуто на один щабель вище, і в пошуках підходящого обробника будуть перевірені розділи catch зовнішнього оператора try. Приклад вкладення двох операторів try catch один в одного за допомогою виклику методу.

Програма може явно викликати виключення, використовуючи оператор throw. Після виконання оператора throw процес виконання програми призупиняється і наступні оператори не виконуються. JVM переглядає найближчий блоки try. catch. відповідний типу виключення, для "передачі управління". Якщо відповідний блок не буде знайдений, то обробник виключень зупинить програму і "роздрукує" при цьому стан стека викликів.

Приклад виключення, в якому спочатку створюється об'єкт-виняток, потім оператор throw збуджує виняткову ситуацію, після чого той же виняток збуджується повторно - на цей раз вже кодом перехопив його в перший раз розділу catch.

Результат виконання програми наведено нижче.

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

Результат роботи прикладу:

У разі, коли необхідно гарантовано виконати певну ділянку коду необхідно використовувати ключове слово finally. Використання зв'язку try. finally дозволяє забезпечити виконання коду незалежно від того, які винятку були порушені і перехоплені, навіть в тих випадках, коли в методі немає відповідного порушеній виключенню розділу catch.

У кожного розділу try повинен бути принаймні або один розділ catch або блок finally. Блок finally дуже зручний для закриття файлів і звільнення будь-яких інших ресурсів, захоплених для тимчасового використання на початку виконання методу.

Нижче наведено приклад класу з двома методами, завершення яких відбувається з різних причин, але в обох перед виходом виконується код розділу finally.

У тестовому прикладі в методі methodA збуджується виключення. Але перед передчасним виходом з блоку try. виконується розділ finally. У другому методі methodB завершується робота в try-блок оператором return. але і при цьому перед виходом з методу виконується програмний код блоку finally. Результат роботи тестового прикладу:

Обробка винятків в Java надає виключно потужний механізм для управління складними програмами. Ключові слова try, throw, catch дозволяють виконувати обробку помилок і різних нештатних ситуацій в програмі.

catch - поліморфний конструкція, тобто catch по типу parent перехоплює виключення будь-якого типу, які є Parent'ом.

В результаті в консолі побачимо

Error і Exception з паралельних гілок успадкування від Throwable. тому catch по одному «брату» не може зловити іншого «брата».

Результат виконанню програми

множинні виключення