— Ага. Ось ти де. Я вже тебе обшукалася.

— Щось сталося?

— Ні, але ж ми займаємося.

— Ок. Я слухаю тебе.

— Я хочу тобі розповісти про винятки ще кілька фактів:

У Java 7 конструкція try-catch була трохи розширена за рахунок додавання «множинних catch». Дивись приклад:

Java 5
try
{
  …
}
 catch (IOException ex)
{
 logger.log(ex);
 throw ex;
}
 catch (SQLException ex)
{
 logger.log(ex);
 throw ex;
}
Java 7
try
{
  …
}
 catch (IOException | SQLException ex)
{
 logger.log(ex);
 throw ex;
}

— Тобто. тепер можна писати кілька винятків через АБО («|» — це бінарний АБО)?

— Так, правда, зручно?

— Гм. А який тип буде у цього об'єкта-виключення всередині блоку catch?

Адже у IOException можуть бути свої методи, а у SQLException – свої.

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

— Ага. Тобто. швидше за все Exeption або RuntimeException. Чому просто не написати catch(Exception e)?

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

Тобто. така схема покликана вирішити проблему дублювання catch-блоків коду для обробки різних помилок.

— Ага. Зрозуміло. Дякую, Еллі.

— Це ще не все, я хочу ще трохи розповісти про блок finally.

Як ти вже, мабуть, знаєш, цей блок виконується завжди.

Коли я говорю завжди, я маю на увазі абсолютно завжди.

Приклад:

Приклад з finally
try
{
return 1;
}
 finally
{
return 0;
}

Тут є return в блоці try і return в блоці finally. Отже, результатом виклику методу буде число 0.

Блок finally виконається, що б не сталося. А його метод return перезатер старе значення, що повертається своїм значенням.

— Ясно.

Більш того, метод може або повернути значення, або викинути виняток.

Тому, якщо в блоці try повертається значення, а в finally викидається виключення, то в результаті буде виключення .

— А якщо в блоці try викидається виняток, а в блоці finally виконується return?

Тоді вважається, що метод коректно відпрацював і повертається значення, яке було передано до return.

Приклад Результати
try
{
 return 1;
}
 finally
{
return 0;
}
0
try
{
 return 1;
}
 finally
{
 throw new RuntimeException();
}
RuntimeException
try
{
 throw new RuntimeException();
}
 finally
{
return 0;
}
0
try
{
 throw new RuntimeException();
}
 finally
{
 throw new IOException();
}
IOException

Єдиною причиною, через яку може не виконатися метод finally, може бути негайне завершення програми за допомогою виклику методу System.exit();< /p>

Приклад
try
{
System.exit(0);
 return 1;
}
 finally
{
return 0;
}

— Ясно.

— Врахуй, зазвичай на співбесідах запитують усі з цієї теми, так що краще тобі це зрозуміти і запам'ятати.