TEMA 4. POO EXCEPTII JAVA. TRATAREA EXCEPTIILOR | Page 6
Checked exceptions, ce corespund clasei Exception:
O aplicaţie bine scrisă ar trebui să le prindă, şi să permită continuarea rulării
programului.
Să luăm ca exemplu un program care cere utilizatorului un nume de fişier
(pentru a-l deschide). În mod normal, utilizatorul va introduce un nume de fişier
care există şi care poate fi deschis. Există insă posibilitatea ca utilizatorul să
greşească, caz în care se va arunca o excepţie FileNotFoundException.
Un program bine scris va prinde această excepţie, va afişa utilizatorului un
mesaj de eroare, şi îi va permite eventual să reintroducă un nou nume de fişier.
Errors, ce corespund clasei Error:
Acestea definesc situaţii excepţionale declanşate de factori externi aplicaţiei, pe
care aceasta nu le poate anticipa şi nu-şi poate reveni, dacă se produc.
Spre exemplu, alocarea unui obiect foarte mare (un vector cu milioane de
elemente), poate arunca OutOfMemoryError.
Aplicaţia poate încerca să prindă această eroare, pentru a anunţa utilizatorul
despre problema apărută; după această însă, programul va eşua (afişând
eventual stack trace).
Runtime Exceptions, ce corespund clasei RuntimeException:
Ca şi erorile, acestea sunt condiţii excepţionale, însă spre deosebire de erori, ele
sunt declanşate de factori interni aplicaţiei. Aplicaţia nu poate anticipa, şi nu îşi
poate reveni dacă acestea sunt aruncate.
Runtime exceptions sunt produse de diverse bug-uri de programare (erori de
logică în aplicaţie, folosire necorespunzătoare a unui API, etc).
Spre exemplu, a realiza apeluri de metode sau membri pe un obiect null va
produce NullPointerException. Fireşte, putem prinde excepţia.
Mai natural însă ar fi să eliminăm din program un astfel de bug care ar produce
excepţia.
Excepţiile CHECKED sunt cele prinse de blocurile try-catch. Toate excepţiile
sunt CHECKED cu excepţia celor de tip Error, RuntimeException şi subclasele
acestora, adica cele de tip UNCHECKED.
Nu
este
indicată
prinderea
excepţiilor UNCHECKED (de
tip Error sau RuntimeException) cu try-catch.
Putem arunca RuntimeException fără să o menţionăm în clauza throws din antet:
public void f(Object o) {
if (o == null)
throw new NullPointerException("o is null");
}