"Ah. Iată-te. Te-am căutat."

"S-a întâmplat ceva?"

— Nu, dar încă studiem.

— OK. Te ascult.

„Vreau să vă mai spun câteva lucruri despre excepții:”

„În Java 7, constructul try-catch a fost ușor extins prin adăugarea de mai multe blocuri catch . Uită-te la acest exemplu:”

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

„Deci acum putem scrie mai multe excepții separate prin operatori SAU („|” este SAU binar)?”

— Așa este. Nu este convenabil?

"Hmm. Dar care va fi tipul obiectului de excepție din interiorul blocului catch?"

„La urma urmei, o excepție IOException are metodele sale, iar o excepție SQLException are metodele sale.”

„Tipul de excepție va fi cel al clasei lor comune de strămoși”.

"Ah. Cu alte cuvinte, cel mai probabil va fi Excepție sau RuntimeException . Atunci de ce să nu scrieți pur și simplu catch(Exception e)?"

„Uneori, atunci când gestionați erorile individual, este convenabil să le grupați, să scrieți unele erori într-un jurnal, să aruncați din nou altele și să le gestionați în alt mod.”

„Cu alte cuvinte, această schemă este recunoscută ca soluționând problema blocurilor de captură duplicate pentru gestionarea diferitelor erori”.

"Ah. Am înțeles. Mulțumesc, Ellie."

— Asta nu e tot. Vreau să vă spun ceva mai multe despre blocul final .

„După cum probabil știți deja, acest bloc este întotdeauna executat.”

„Și când spun întotdeauna, mă refer la absolut întotdeauna ”.

"De exemplu:"

Exemplu folosind finally
try
{
 return 1;
}
 finally
{
 return 0;
}

"Aici există o întoarcere în blocul try și o întoarcere în blocul final . Deci valoarea de returnare a acestei metode va fi numărul 0."

„ Blocul finally se va executa indiferent de ce se întâmplă. Și instrucțiunea de returnare suprascrie cealaltă valoare returnată cu propria sa valoare.”

"Înțeleg."

„Cu toate acestea, o metodă poate fie să returneze o valoare, fie să arunce o excepție.

„Deci, dacă o valoare este returnată într-un bloc try, dar blocul final aruncă o excepție , atunci rezultatul va fi o excepție .

"Ce se întâmplă dacă o excepție este aruncată în blocul try , dar blocul final are o instrucțiune return?"

„Atunci este ca și cum metoda a funcționat corect și valoarea din instrucțiunea de returnare este returnată.

Exemplu Rezultat
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

„Singurul motiv pentru care metoda finally ar putea să nu fie executată ar fi terminarea imediată a programului printr-un apel la metoda System.exit(); ”.

Exemplu
try
{
 System.exit(0);
 return 1;
}
 finally
{
 return 0;
}

"Înțeleg."

„Țineți minte că toate aceste subiecte sunt de obicei întrebate în interviuri, așa că ar fi bine să le înțelegeți și să le amintiți.”