Try / Catch
Când ceva merge prost la rulare (împărțire la zero, acces la un indice inexistent, parsare de text invalid), Java aruncă o excepție și programul se prăbușește. try/catch te lasă să prinzi eroarea și să continui
public class Main {
public static void main(String[] args) {
try {
int rezultat = 10 / 0;
System.out.println(rezultat);
} catch (ArithmeticException e) {
System.out.println("Nu se poate imparti la zero!");
}
System.out.println("Programul continua...");
}
}
Ieșire
Nu se poate imparti la zero!
Programul continua...
Fără try/catch, programul s-ar opri la 10 / 0. Cu el, Java prinde eroarea, rulează blocul catch și merge mai departe
Structura de bază
public class Main {
public static void main(String[] args) {
try {
// cod care ar putea esua
} catch (TipExceptie e) {
// ce sa faci daca esueza
}
}
}
e este obiectul excepție. Poți apela e.getMessage() ca să obții o descriere a ce a mers prost
public class Main {
public static void main(String[] args) {
try {
int[] numere = {1, 2, 3};
System.out.println(numere[10]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Eroare: " + e.getMessage());
}
}
}
Ieșire
Eroare: Index 10 out of bounds for length 3
Tipurile cele mai comune de excepții
- ArithmeticException: împărțire la zero
- ArrayIndexOutOfBoundsException: indice de array inexistent
- NumberFormatException: parsare de string care nu e număr valid
- NullPointerException: folosirea unei variabile care este null
- ClassCastException: conversie de obiect invalidă
Poți prinde o Exception generală, dar e mai bine să fii specific: tratezi fiecare situație diferit
Poți avea mai multe blocuri catch
public class Main {
public static void main(String[] args) {
try {
String text = "hello";
int numar = Integer.parseInt(text);
} catch (NumberFormatException e) {
System.out.println("Nu e un numar: " + e.getMessage());
} catch (Exception e) {
System.out.println("Altceva a mers prost: " + e.getMessage());
}
}
}
Java încearcă fiecare catch de sus în jos și îl folosește pe primul care se potrivește. Pune excepțiile specifice înaintea celor generale
Blocul finally rulează oricum, fie că try-ul a reușit, fie că o excepție a fost prinsă
public class Main {
public static void main(String[] args) {
try {
System.out.println("Se incearca...");
int x = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Eroare prinsa!");
} finally {
System.out.println("Asta ruleaza mereu");
}
}
}
Ieșire
Se incearca...
Eroare prinsa!
Asta ruleaza mereu
Util pentru curățenie: închiderea fișierelor, eliberarea resurselor
Când try/catch vs verificare directă?
Nu folosi try/catch ca pe o cârjă. Dacă știi că un array are 3 elemente, nu accesa indicele 10, verifică pur și simplu. Folosește try/catch pentru lucruri pe care nu le poți prezice: input de la utilizator, parsare de text
Misiune: Plățile din Vice City
Tommy primește plăți de la afacerile sale, dar unele rapoarte vin corupte. Phil trimite "7500", Lance trimite "nu stiu", Mercedes trimite "23000" și Cortez trimite "eroare". Tommy trebuie să parseze fiecare sumă și să trateze rapoartele invalide
Stochează rapoartele primite într-un array String[] rapoarte. Parcurge-l și încearcă să parsezi fiecare ca număr cu Integer.parseInt(). Dacă reușește, afișează "Plata: suma". Dacă nu, prinde NumberFormatException și afișează "Raport invalid: raport"
Exemplu
Plata: 7500
Raport invalid: nu stiu
Plata: 23000
Raport invalid: eroare