— Привіт, Аміго!

— Привіт, Еллі! Як життя?

— Чудово дякую. А ти як?

— Супер, сьогодні вранці стільки нового розповіли.

— Так це ж чудово. Чи не втомився?

— Так, є така справа. Стомився трохи.

— Тоді тобі просто пощастило. Тому що хотіла тобі сьогодні дати велику та складну тему, але в останній момент передумала та вирішувала розповісти маленьку та легку.

— Маленьку та легку? Я готовий.

— Сьогодні ми з тобою детально розберемо тему винятків. Exception.

— Ти про обробку помилок?

— Вважати виняток помилками – це невірний підхід. Винятки більше схожі на звіт про те, що пішло не так. За допомогою якого можна запропонувати альтернативні сценарії дії.

Уся справа у методах. Коли ти викликаєш якийсь метод, він гарантовано повинен зробити те, для чого його викликали.

Коли метод з якихось причин не може зробити те, для чого його викликали, він зобов'язаний повідомити про це зухвалого.

Тобто. найгірше, що може статися - це коли метод не виконав свою роботу, і нікого про це не повідомив. Гірше за це не може бути нічого. Це втрата контролю за ситуацією.

Коли ти програміст-початківець, тобі здається, що ти викликаєш методи і вони обов'язково зроблять те, про що ти їх просиш.

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

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

— Як те, що програма щось показує неправильно, може бути гірше, ніж якщо програма закрилася, і всі дані загубилися?

— А чого ти взяв, що програма просто щось неправильно показує? Може, у неї всередині купа помилок і всі дані твоєї роботи з нею будуть безповоротно втрачені? Ти три години набирав текст, який не збережеться, тому що на другій хвилині роботи сталася помилка.

Коли програміст-початківець стикається з винятками, він засмучується.

Але насправді винятки показують йому всі ті сценарії поведінки, які він мав передбачити і не передбачив.

Ти можеш не обробляти винятки, і тоді — ти поганий програміст. Але якщо твої методи не викидають винятків, тоді взагалі не програміст, т.к. так і не зрозумів простої істини:

Метод або робить те, навіщо він написаний, або кидає виняток. Третього не дано!

— Добре, вірю. Обіцяю користуватися винятками.

— Чудово. Тоді давай я розповім тобі про ієрархію винятків:

ієрархія винятків, errors - 1

Ієрархія винятків базується на чотирьох класах.

Найбільш базовий клас – це Throwable.

Від нього успадковано класи Error і Exception.

Від Exception успадкований RuntimeException.

Клас< Error є базовим класом для помилок Java-машини, таких як StackOverFlowOutOfMemory , …

Виправити наслідки таких помилок програма зазвичай не може, і це призводить до її завершення.

Справді, що можна зробити, якщо для подальшої нормальної роботи програми не вистачає пам'яті або переповнився стек.

КласException є базовим для всіх звичайних винятків, які викидаються програмою. RuntimeException – це підкатегорія винятків Exception, до яких застосовуються інші правила.

— Це які?

— Саме зараз і розповім.

Як ти, напевно, пам'ятаєш, винятки поділяються на дві категорії checked (перевірені) та unchecked ( неперевірені).

Якщо метод викидає checked винятки, то метод, що викликає, повинен обернути виклик такого методу в блок try-catch. Ну, або прокинути виняток вище (своєму зухвалому), явно вказавши його в списку throws у сигнатурі методу.

На unchecked такі правила/обмеження не поширюються.

Так ось, всі винятки, успадковані від Exception, вважаються checked. Крім винятків, успадкованих від RuntimeException – вони unchecked.

— Ага. Пригадую, щось таке мені раніше розповідали.

— Аміго! Ієрархію виключень запитують на кожній співбесіді. Ще раз –на кожному. Ти маєш чудово знати цю тему.

— Ок. Я ще раз усе перечитаю та розберуся. Дякую, що допомагаєш мені, Еллі.