Назад Зміст Вперед

9.1. Типи переривань. Exceptions

Винятками або винятковими ситуаціями (станами) називаються помилки, що виникли в програмі під час її роботи.

Всі виключення в Java є об'єктами. Тому вони можуть породжуватися не тільки автоматично при виникненні виняткової ситуації, але і створюватися самим розробником.

Ієрархія класів винятків:
(Partial class hierarchy for Throwable objects)

Винятки діляться на кілька класів, але всі вони мають спільного предка - клас Throwable. Його нащадками є підкласи Exception і Error.

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

Помилки (Errors) представляють собою більш серйозні проблеми, які, відповідно до специфікації Java, не слід намагатися обробляти у власній програмі, оскільки вони пов'язані з проблемами рівня JVM. Наприклад, виключення такого роду виникають, якщо закінчилася пам'ять, доступна віртуальній машині. Програма додаткову пам'ять все одно не зможе забезпечити для JVM.

У Java всі винятки діляться на три типи: 
  1. контрольовані виключення (checked) (Checked виключення, це ті, які повинні оброблятися блоком catch або описуватися в сигнатурі методу. Unchecked можуть не оброблятися і не бути описаними.);
  2. неконтрольовані виключення (unchecked), до яких відносяться помилки (Errors) (успадковані від RuntimeException, checked - від Exception);
  3. виключення часу виконання (RuntimeExceptions, нащадок класу Exception).
Контрольованими виключеннями є помилки, які можна і потрібно обробляти в програмі, до цього типу належать усі нащадки класу Exception (але не RuntimeException).

До механізму обробки виключень в Java мають відношення 5 ключових слів:-try, catch, throw, throws і finally. Схема роботи цього механізму наступна. Ви намагаєтеся (try) виконати блок коду, і якщо при цьому виникає помилка, система порушує (throw) виключення, яке залежно від його типу ви можете перехопити (catch) або передати замовчуваному (finally) обробникові.

Нижче приведена загальна форма блоку обробки виключень:

try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
   //дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
   //дії при виникненні типу винятку2 (обробник винятку)
}
 //….
[finally{
        //дії при виході з конструкції try.
 }]

Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний після обробки винятку в інструкції catch.

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

Неконтрольовані виключення не вимагають обов'язкової обробки, проте, при бажанні, можна обробляти виключення класу RuntimeException.

Скомпілюємо і запустимо таку програму:
class Main { 
     public static void main(String[] args) { 
         int a = 4; 
         System.out.println(a/0); 
     } }

У момент запуску на консоль буде виведено наступне повідомлення:
Exception in thread "main" java.lang.ArithmeticException: / by zero 
        at Main.main(Main.java:4)

З повідомлення видно клас, що сталося виключення - ArithmeticException. Це виняток можна обробити:
class Main { 
     public static void main(String[] args) { 
         int a = 4; 
         try { 
              System.out.println(a/0); 
         } catch (ArithmeticException e) { 
              System.out.println("Відбулася неприпустима арифметична операція"); 
         } 
     } }

Основні правила обробки винятків

Використовуйте виключення для того, щоб:
  • обробити помилку на поточному рівні (уникайте перехоплювати виключення, якщо ви не знаєте, як з ними вчинити);
  • виправити проблему і знову викликати метод, який порушив виключення;
  • вжити всіх необхідних заходів і продовжити виконання без повторного виклику методу;
  • спробувати знайти альтернативний результат замість того, який мав би зробити викликаний метод;
  • зробити все можливе в поточному контексті і заново порушити це ж виняток, перенаправивши його на більш високий рівень;
  • зробити все, що можна в поточному контексті, і порушити нову виняток, перенаправивши його на більш високий рівень;
  • завершити роботу програми;
  • спростити програму (якщо використовувана вами схема обробки виключень робить все тільки складніше, значить, вона нікуди не годиться);
  • додати вашій бібліотеці і програму безпеки (спочатку це допоможе в налагодженні програми, а в подальшому окупиться її надійністю).
.