— Ага. Ось ти де. Я вже тебе обшукалася.
— Щось сталося?
— Ні, але ж ми займаємося.
— Ок. Я слухаю тебе.
— Я хочу тобі розповісти про винятки ще кілька фактів:
У Java 7 конструкція try-catch була трохи розширена за рахунок додавання «множинних catch». Дивись приклад:
try
{
…
}
catch (IOException ex)
{
logger.log(ex);
throw ex;
}
catch (SQLException ex)
{
logger.log(ex);
throw ex;
}
try
{
…
}
catch (IOException | SQLException ex)
{
logger.log(ex);
throw ex;
}
— Тобто. тепер можна писати кілька винятків через АБО («|» — це бінарний АБО)?
— Так, правда, зручно?
— Гм. А який тип буде у цього об'єкта-виключення всередині блоку catch?
Адже у IOException можуть бути свої методи, а у SQLException – свої.
— Тип винятку буде такий самий, як і у їхнього загального класу-предка.
— Ага. Тобто. швидше за все Exeption або RuntimeException. Чому просто не написати catch(Exception e)?
— Іноді, коли програмісти обробляють всі помилки окремо, буває зручно розбити їх на групи та одні помилки записати в балку, інші прокинути вище, треті обробити іншим способом.
Тобто. така схема покликана вирішити проблему дублювання catch-блоків коду для обробки різних помилок.
— Ага. Зрозуміло. Дякую, Еллі.
— Це ще не все, я хочу ще трохи розповісти про блок finally.
Як ти вже, мабуть, знаєш, цей блок виконується завжди.
Коли я говорю завжди, я маю на увазі абсолютно завжди.
Приклад:
try
{
return 1;
}
finally
{
return 0;
}
Тут є return в блоці try і return в блоці finally. Отже, результатом виклику методу буде число 0.
Блок finally виконається, що б не сталося. А його метод return перезатер старе значення, що повертається своїм значенням.
— Ясно.
Більш того, метод може або повернути значення, або викинути виняток.
Тому, якщо в блоці try повертається значення, а в finally викидається виключення, то в результаті буде виключення .
— А якщо в блоці try викидається виняток, а в блоці finally виконується return?
Тоді вважається, що метод коректно відпрацював і повертається значення, яке було передано до return.
Приклад | Результати |
---|---|
|
0 |
|
RuntimeException |
|
0 |
|
IOException |
Єдиною причиною, через яку може не виконатися метод finally, може бути негайне завершення програми за допомогою виклику методу System.exit();< /p>
try
{
System.exit(0);
return 1;
}
finally
{
return 0;
}
— Ясно.
— Врахуй, зазвичай на співбесідах запитують усі з цієї теми, так що краще тобі це зрозуміти і запам'ятати.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ