Exception în Java

Clasa de bază pentru erorile pe care un program le poate trata; getMessage() returnează mesajul dat la creare.

Sintaxă
public class Exception extends Throwable

Exception()
Exception(String mesaj)
Exception(String mesaj, Throwable cauza)
String getMessage()

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 Exception peste tot și nu faci nimic în catch. Erorile dispar fără urmă; prinde doar ce știi să tratezi și afișează sau înregistrează restul.
  • Pui catch (Exception e) înaintea unui catch mai specific. Nu compilează: blocul specific n-ar mai fi atins niciodată.
  • Afișezi doar getMessage(), care poate fi null. 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).