"Ах. Ето те. Търсих те."

"Случило ли се е нещо?"

— Не, но все още учим.

"Добре. Слушам."

„Искам да ви кажа още няколко неща за изключенията:“

„В 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;
}

„Така че сега можем ли да напишем множество изключения, разделени с оператори ИЛИ („|“ е двоично ИЛИ)?“

— Така е. Не е ли удобно?

"Хм. Но Howъв ще бъде типът на обекта за изключение вътре в блока catch?"

„В края на краищата IOException има своите методи, а SQLException има своите методи.“

„Типът изключение ще бъде този на техния общ предшественик клас.“

"А. С други думи, най-вероятно ще бъде Exeption or RuntimeException . Тогава защо просто не напишете catch(Exception e)?"

„Понякога, когато се обработват грешките поотделно, е удобно да се групират, записвайки някои грешки в дневник, повторно хвърляйки други и обработвайки трети по няHowъв друг начин.“

„С други думи, тази схема се разпознава като решаваща проблема с дублиращи се блокове за улавяне за обработка на различни грешки.“

„А, разбрах. Благодаря, Ели.“

„Това не е всичко. Искам да ви разкажа малко повече за финалния блок.“

„Както вероятно вече знаете, този блок винаги се изпълнява.“

"И когато казвам винаги, имам предвид абсолютно винаги ."

"Например:"

Пример за използване на finally
try
{
 return 1;
}
 finally
{
 return 0;
}

„Тук има връщане в блока try и връщане в блока finally . Така че върнатата стойност на този метод ще бъде числото 0.“

„ Блокът finally ще се изпълни, независимо Howво се случва. И неговият оператор за връщане презаписва другата върната стойност със собствената си стойност.“

"Виждам."

"Въпреки това методът може or да върне стойност, or да хвърли изключение. "

„Така че, ако дадена стойност е върната в блок try, но блокът finally хвърля изключение , тогава резултатът ще бъде изключение .

„Какво ще стане, ако в блока try бъде хвърлено изключение, но блокът finally има израз за връщане?“

„Тогава сякаш методът работи правилно и стойността в оператора 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() ;.“

Пример
try
{
 System.exit(0);
 return 1;
}
 finally
{
 return 0;
}

"Виждам."

„Имайте предвид, че всички тези теми обикновено се задават на интервюта, така че би било добре да ги разберете и запомните.“