"Ах. Ето те. Търсих те."
"Случило ли се е нещо?"
— Не, но все още учим.
"Добре. Слушам."
„Искам да ви кажа още няколко неща за изключенията:“
„В 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;
}
„Така че сега можем ли да напишем множество изключения, разделени с оператори ИЛИ („|“ е двоично ИЛИ)?“
— Така е. Не е ли удобно?
"Хм. Но Howъв ще бъде типът на обекта за изключение вътре в блока catch?"
„В края на краищата IOException има своите методи, а SQLException има своите методи.“
„Типът изключение ще бъде този на техния общ предшественик клас.“
"А. С други думи, най-вероятно ще бъде Exeption or RuntimeException . Тогава защо просто не напишете catch(Exception e)?"
„Понякога, когато се обработват грешките поотделно, е удобно да се групират, записвайки някои грешки в дневник, повторно хвърляйки други и обработвайки трети по няHowъв друг начин.“
„С други думи, тази схема се разпознава като решаваща проблема с дублиращи се блокове за улавяне за обработка на различни грешки.“
„А, разбрах. Благодаря, Ели.“
„Това не е всичко. Искам да ви разкажа малко повече за финалния блок.“
„Както вероятно вече знаете, този блок винаги се изпълнява.“
"И когато казвам винаги, имам предвид абсолютно винаги ."
"Например:"
try
{
return 1;
}
finally
{
return 0;
}
„Тук има връщане в блока try и връщане в блока finally . Така че върнатата стойност на този метод ще бъде числото 0.“
„ Блокът finally ще се изпълни, независимо Howво се случва. И неговият оператор за връщане презаписва другата върната стойност със собствената си стойност.“
"Виждам."
"Въпреки това методът може or да върне стойност, or да хвърли изключение. "
„Така че, ако дадена стойност е върната в блок try, но блокът finally хвърля изключение , тогава резултатът ще бъде изключение . “
„Какво ще стане, ако в блока try бъде хвърлено изключение, но блокът finally има израз за връщане?“
„Тогава сякаш методът работи правилно и стойността в оператора return се връща.
Пример | Резултат |
---|---|
|
0 |
|
RuntimeException |
|
0 |
|
IOException |
„Единствената причина, поради която методът finally може да не бъде изпълнен, е незабавното прекратяване на програмата чрез извикване на метода System.exit() ;.“
try
{
System.exit(0);
return 1;
}
finally
{
return 0;
}
"Виждам."
„Имайте предвид, че всички тези теми обикновено се задават на интервюта, така че би било добре да ги разберете и запомните.“
GO TO FULL VERSION