În programul din fișierul TestExcept1.java se testează apariția unei excepții de împărțire la zero. Întrucât variabila b are valoarea zero, la executarea împărțirii a/b procesorul calculatorului generează o excepție aritmetică. Întrucât în programul nostru nu există instrucțiuni prin care să se trateze această excepție, programul se întrerupe, trecându-se controlul asupra sistemului de operare al calculatorului, iar acesta afișeaza excepția survenită și oprește executarea programului. |
În limbajul Java, există posibilitatea de a se trata prin program diferitele excepții care apar în timpul execuției. În acest fel, programatorul poate să prevadă căi alternative de continuare a executării programului, fără a mai fi necesară oprirea executării lui. În mediul de lucru Java, la apariția unei excepții se generează un obiect special numit excepție, care conține informația despre excepția respectivă. Acest obiect poate fi captat prin program, iar informația conținută în el poate fi utilizată pentru a decide calea pe care se va merge în continuare în derularea programului. Toate obiectele de excepție care se referă la același tip de incident formează o clasă de excepții.
Tratarea prin program a excepțiilor se face, în limbajul Java,
folosind instrucțiunea try urmată de una sau mai multe clauze catch
și, opțional, de o clauză finally sub forma urmatoare:
try {
secventa
}
catch (ClasaExceptie1variabila1)
{
secventa1
}
catch (ClasaExceptie2 variabila2)
{
secventa2
}
...............
catch (ClasaExceptieN variabilaN)
{
secventaN
}
[finally {
secventa_finalizatoare
}]
În engleza, try înseamnă încearcă, iar catch înseamnă prinde. În corpul instrucțiunii try se pune secvența de instrucțiuni în care este posibil ca, la executarea programului, să apară excepții. Dacă excepția a apărut într-un punct situat în corpul unei instrucțiuni try, aceasta instrucțiune se termină în mod abrupt, astfel că restul instrucțiunilor nu se mai execută, trecându-se direct la acolada de închidere a blocului. Se parcurg apoi, una după alta, clauzele catch, până se ajunge la cea care are între paranteze numele clasei excepției care s-a produs și se execută secvența din corpul acestei clauze.
Clauza finally este opțională și conține o secvență de
instructiuni care se vor executa în final, adică după ce a fost tratată
excepția prin una din clauzele catch, sau dacă nu a fost tratată prin
nici una dintre acestea.
Exemplul 1: În fișierul TestExcept2.java este dată o
modificare a programului din fișierul TestExcept1.java,
în care excepția este tratată prin instrucțiunea try.
Întrucât se știa că este posibilă apariția unei excepții aritmetice, s-a
încercat să se capteze mai întai această excepție. Ca rezervă, s-a
prevăzut și o clauza catch pentru clasa Exception, care va
capta orice alta excepție. Comparând rezultatele executării celor două
programe menționate, constatăm că, atunci când s-au tratat excepțiile
prin instrucțiunea try, programul nu a mai fost oprit anormal,
ci s-a executat blocul clauzei catch(ArithmeticException e1),
după care s-a continuat executarea normală a programului. În schimb,
instrucțiunile existente în blocul try, după cea care a
generat excepția, nu au mai fost executate.
Exemplul 2: În fișierul TestExcept3.java se reia programul din exemplul anterior, dar a fost suprimată prima din clauzele catch. Executând acest program, se poate observa că și de data aceasta excepția aritmetică a fost captata, însa de clauza catch(Exception e). Exemplul 3: În fișierul TestExcept4.java se reia programul din Exemplul 1, dar după captarea excepției s-a introdus si clauza finally. Se observă ca secvența din aceasta clauză este executată chiar daca excepția a fost captată prin catch. Mai mult, în fișierul TestExcept5.java s-a reluat același program, dar s-a modificat valoarea numitorului fracției, astfel că nu mai are loc o împărțire la zero. Se observă ca secvența din clauza finallyeste executată și în acest caz. |