1. Оператор throw
Виняток, поки його не викинуто в систему або коли його вже перехоплено блоком catch
— це, власне, просто об'єкт класу, успадкованого від Exception
(точніше, від Throwable
). Ніяких магічних особливостей сам об'єкт-виняток не має.
Уся логіка роботи винятків — це просто особливий сценарій поведінки Java-машини, коли в її середовище виконання вкинуто виняток.
Ви завжди можете знову вкинути Java-машині виняток, який щойно перехопили. Для цього слід використовувати оператор throw
:
throw виняток;
Приклад:
Код | Виведення на екран |
---|---|
|
|
У цьому коді ми перехопили виняток, вивели на екран відповідний напис і знову викинули цей виняток.
Повторно кинутий виняток не може бути захоплено іншими блоками catch
цього самого try
-блока.
2. Свій виняток
До речі, ви можете самі створити об'єкт-виняток: це просто об'єкт типу Exception
або успадкованого від нього класу. І викинути його.
Це простіше, ніж здається. Приклад:
Код | Виведення на екран |
---|---|
|
|
У прикладі вище ми створили новий об'єкт-виняток типу RuntimeException
і миттєво кинули його за допомогою оператора throw
.
Його відразу захопить блок catch
, оскільки тип RuntimeException успадковано від типу Exception
. Код catch(Exception except)
захоплює об'єкти-винятки всіх класів, успадкованих від класу Exception
.
3. Ключове слово finally
Ще один важливий момент. Іноді програмісту потрібно виконати певні дії незалежно від того, був у коді виняток чи ні. Наприклад, у коді ми відкрили файл для запису, а відкритий файл треба обов'язково закрити викликом методу close()
.
try
{
код, де може виникнути помилка
}
catch(ТипВинятку ім'я)
{
код обробки винятку
}
finally
{
код, який потрібно виконати в будь-якому разі
}
Для виконання таких обов'язкових дій до оператора try-catch
додали ще один блок — finally
й отримали оператор try-catch-finally
. Отакий приблизно вигляд це має:
Приклад:
FileInputStream source = null;
try
{
source = new FileInputStream("c:\\note.txt");
source.read();
}
catch(Exception except)
{
System.out.println("Перехопили виняток");
throw except;
}
finally
{
if (source != null)
source.close();
}
Код у блоці finally
буде виконано в будь-якому випадку незалежно від того, був виняток чи ні. Навіть якщо виняток виник і його не було перехоплено, блок finally
все одно буде виконано.
До речі, якщо ви не хочете перехоплювати виняток, а блок finally
вам потрібен, використовуйте скорочений запис блока try-catch-finally
— try-finally
. Він має приблизно такий вигляд:
try
{
код, де може виникнути помилка
}
finally
{
код, який потрібно виконати в будь-якому разі
}
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ