Винятки в java
Як відомо, виключення - це події, що виникають при виконанні програми. Ці події порушують нормальний хід речей.
Блок try, блок catch
Частина коду, де можливе виникнення виняткової ситуації, охоплюють блоком try.
Обробники винятків оголошуються в блоці catch, який йде відразу за блоком try.
Блоків catch може бути кілька для одного блоку try.
У блоці catch йде обробка винятків, а його аргумент вказує тип винятку, який може обробити даний блок, тобто тип аргументу є тип винятку. Код, записаний в блоці catch є обробник виключення.
блок finally
Після блоку (ів) ислючение може розташовуватися блок finally. Прийнятний випадок, коли немає блоків catch, але є блок finally. Код блоку finally виконується завжди, а не тільки при виникненні виключення. У ньому можна виконувати обов'язкові завершальні дії, очищення, наприклад, закрити потік, а не в блоці try. Після finally виконання програми триває з наступного рядка коду.
Схематично все виглядати так:
а може бути без блоків catch, ось так:
або без блоку finally:
Розглянемо докладніше, що відбувається при виникненні виняткової ситуації.
При виникненні виняткової ситуації, формується об'єкт виключення, що містить інформацію про це виключення, який передається системі. У таких випадках кажуть, що соотвестсвія частина програми викидає виключення, тобто формує об'єкт виключення і передає його системі. Далі починається робота системи, але перш ніж ми її розберемо, треба зрозуміти що таке стек викликів.
Стек викликів (call stack)
Стек викликів (call stack) - це пследовательность викликів методів, починаючи від методу main до цікавить нас методу. Розглянемо умовний приклад. Є клас:
Тут стек викликів такий: main викликає methodA (), methodA () викликає methodB (), methodB () викликає methodС ().
Якби у methodA () було кілька блоків catch, то система вибрала б перший відповідний блок, тобто такий блок, тип аргументу якого збігається з типом винятку.
Контрольовані (checked) виключення. Наприклад, помилки введення. Такі винятки рекомендується обробляти;
Помилка (error). Це виключення, викликані зовнішніми, по відношенню до додатка, причинами і додаток їх, як правило, не виконує жодних. Такі винятки визначаються класом Error або його підкласами;
Винятки часу виконання (runtime exception). Наприклад, помилки в коді. Такі винятки визначаються класом RuntimeException або його підкласами. Ці виключення можуть оброблятися.
Винятки другого і третього типу називають неконтрольовані (unchecked) виключення.
Метод може сам викинути виняток. Для цього використовують оператор throw і об'єкт виключення в ньому. приклад:
Якщо цьому прикладі a <10, то будет выброшено исключение AnException, так, как если бы здесь произошла соответствующая ошибка.
Викинути виключення оператором throw можна і з тіла оработчіка іншого виключення. Так виникає ланцюжок винятків (chained exceptions). приклад:
Всі класи виключень сходять до класу Throwable. Безпосередніми спадкоємцями його є класи Error і Exception. Від Exception відбуваються RuntimeException і всі класи контрольованих винятків.
Ми вже знаємо, що виключення типу Error обробляє система, ми їх зазвичай не торкаємося.
Винятки типу RuntimeException говорять про помилки в коді. Такі винятки можуть оброблятися, але краще просто виправити помилки коду.
Винятки типу Exception говорять про наявність проблем, але вони не є серйозними системними. Такі помилки слід обробляти.
Можна створювати свої класи виключень як прямих чи ні наследков Exception. Прийнято до назв таких класів додавати слово Exception.
Якщо тип аргументу оператора catch є Exception. то соотвестсвія обробник виключень зможе захопити всі контрольовані виключення і виключення типу RuntimeException. Так можна поступити, якщо немає особливих вимог до обробника або якщо можуть виникнути непередбачені виключення. Але якщо потрібен особливий підхід, то краще використовувати спадкоємців Exception.
Як самому створити клас виключення?
Так як ми повинні обробляти контрольовані виключення, то успадкуємо наш клас від Exception.
У висновку привожу повний код прикладу, який розглядався протягом цього розділу. Головний клас:
Клас виключення AnException:
Клас виключення NextException: