Ce face Exception
Exception este clasa de bază a excepțiilor obișnuite. Subclasele ei se împart în două: excepții verificate (de exemplu IOException), pe care compilatorul te obligă să le prinzi cu catch sau să le declari cu throws, și excepții neverificate, cele care extind RuntimeException.
Îți creezi propriile excepții extinzând Exception (verificată) sau RuntimeException (neverificată). Constructorul primește un mesaj, eventual și cauza. Pentru că Throwable este Serializable, o clasă proprie de excepție are de obicei un câmp serialVersionUID; altfel javac -Xlint avertizează.
getMessage() returnează mesajul dat la creare sau null dacă nu a fost dat. toString() afișează numele complet al clasei plus mesajul, de exemplu java.io.IOException: disc plin.
Parametri
| Parametru | Descriere |
|---|---|
mesaj |
Descrierea erorii, returnată de getMessage(). |
cauza |
Excepția originală care a produs-o (vezi getCause). |
Ce returnează
getMessage() returnează un String sau null.
Exemple
Exemplul 1: O excepție verificată proprie
public class Main {
static class StocInsuficientException extends Exception {
private static final long serialVersionUID = 1L;
StocInsuficientException(String mesaj) {
super(mesaj);
}
}
static int stoc = 3;
static void vinde(String produs, int bucati) throws StocInsuficientException {
if (bucati > stoc) {
throw new StocInsuficientException("Cerute " + bucati + " bucăți de " + produs + ", în stoc doar " + stoc);
}
stoc -= bucati;
System.out.println("Vândut: " + bucati + " x " + produs);
}
public static void main(String[] args) {
try {
vinde("caiet", 2);
vinde("caiet", 5);
} catch (StocInsuficientException e) {
System.out.println("Eroare: " + e.getMessage());
}
}
}
Rezultat
Vândut: 2 x caiet
Eroare: Cerute 5 bucăți de caiet, în stoc doar 1
Exemplul 2: getMessage, toString și mesaj lipsă
import java.io.IOException;
public class Main {
public static void main(String[] args) {
Exception cuMesaj = new IOException("discul este plin");
Exception faraMesaj = new Exception();
System.out.println("getMessage: " + cuMesaj.getMessage());
System.out.println("toString: " + cuMesaj);
System.out.println("fără mesaj: " + faraMesaj.getMessage() + " / " + faraMesaj);
}
}
Rezultat
getMessage: discul este plin
toString: java.io.IOException: discul este plin
fără mesaj: null / java.lang.Exception
Exemplul 3: Mai multe excepții prinse în ordine
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class Main {
static int citesteNota(String fisier) throws IOException {
return Integer.parseInt(Files.readString(Path.of(fisier)).strip());
}
public static void main(String[] args) throws IOException {
Files.writeString(Path.of("nota_ana.txt"), "9\n");
Files.writeString(Path.of("nota_mihai.txt"), "nouă\n");
for (String f : new String[] {"nota_ana.txt", "nota_mihai.txt", "nota_ioana.txt"}) {
try {
System.out.println(f + ": " + citesteNota(f));
} catch (NumberFormatException e) {
System.out.println(f + ": conținut greșit (" + e.getMessage() + ")");
} catch (IOException e) {
System.out.println(f + ": nu pot citi fișierul (" + e.getClass().getSimpleName() + ")");
}
}
}
}
Rezultat
nota_ana.txt: 9
nota_mihai.txt: conținut greșit (For input string: "nouă")
nota_ioana.txt: nu pot citi fișierul (NoSuchFileException)
Greșeli frecvente
- Prinzi
Exceptionpeste tot și nu faci nimic încatch. Erorile dispar fără urmă; prinde doar ce știi să tratezi și afișează sau înregistrează restul. - Pui
catch (Exception e)înaintea unuicatchmai specific. Nu compilează: blocul specific n-ar mai fi atins niciodată. - Afișezi doar
getMessage(), care poate finull.toString()arată și tipul excepției.
Comenzi înrudite
RuntimeException: Clasa de bază a excepțiilor neverificate: nu trebuie declarate cu throws și nici prinse obligatoriu.Exception.getCause: Returnează excepția originală care a produs-o pe aceasta (lanț de excepții), sau null dacă nu există.Exception.printStackTrace: Afișează excepția și lista de apeluri (stack trace) care a dus la ea; implicit pe ieșirea de erori (System.err).IllegalArgumentException: Excepția aruncată când o metodă primește un argument cu valoare nepermisă (vârstă negativă, lună 13).