1. throwoperator

Când o excepție este capturată de un catchbloc și până când este aruncată la mașina Java, este doar un obiect care moștenește Exception(sau mai degrabă, Throwable). Obiectul excepție în sine nu are proprietăți magice.

Toată logica modului în care funcționează excepțiile este doar un mod special în care mașina Java se comportă atunci când îi este aruncată o excepție.

Puteți oricând să reintroduceți o excepție prinsă la mașina Java. Pentru a face acest lucru, trebuie să utilizați throwoperatorul:

throw exception;

Exemplu:

Cod Ieșire de consolă
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

În acest cod, am prins o excepție, am afișat un mesaj despre aceasta pe ecran și apoi am reintrodus-o.

O excepție reintrodusă nu poate fi prinsă de alte catchblocuri din același trybloc.


2. Excepțiile tale

Apropo, puteți crea singur un obiect excepție: este doar un obiect al cărui tip este Exceptionsau o clasă care îl moștenește. Și aruncă-l.

E mai ușor decât pare. Exemplu:

Cod Ieșire de consolă
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

În exemplul de mai sus, am creat un nou obiect excepție al cărui tip este RuntimeExceptionși l-am aruncat imediat folosind throwoperatorul.

Acesta va fi imediat prins de catchbloc, deoarece RuntimeException moștenește Exception. Codul catch (Exception except)prinde obiecte excepție ale tuturor claselor care moștenesc Exceptionclasa.



3. finallycuvânt cheie

Un alt punct important. Uneori, un programator trebuie să efectueze o acțiune, indiferent dacă a apărut o excepție în cod. De exemplu, să presupunem că am deschis un fișier pentru scriere. Fișierul deschis trebuie închis apelând close().

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}
finally
{
   // Code that must executed no matter what happens
}

Pentru a efectua aceste acțiuni obligatorii, un alt tip de bloc ( finally) a fost adăugat la try-catchconstruct, creând astfel try-catch-finallyconstructul. Arata cam asa:

Exemplu:

FileInputStream source = null;
try
{
   source = new FileInputStream("c:\\note.txt");
   source.read();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
finally
{
   if (source != null)
      source.close();
}

Codul din finallybloc se va executa în orice caz, indiferent dacă a existat o excepție. Chiar dacă o excepție este aruncată și nu este prinsă, finallyblocul se va executa în continuare.

Apropo, dacă nu doriți să prindeți o excepție, dar aveți nevoie de un finallybloc, utilizați notația scurtă pentru try-catch-finallyconstruct: un try-finallybloc. Arata cam asa:

try
{
   // Code where an exception might occur
}
finally
{
   // Code that must executed no matter what happens
}