Jede Exception erbt von Throwable folgende Methoden:

public String getMessage()
public void printStackTrace()
public String toString() // Klassennamen und Fehlertext

Eigene Exceptions definieren:

class MeineException1 extends Exception { }
class MeineException2 extends Exception {
    MeineException2(String s) { super(s); }
}

Try-Catch

try {
    // Code, der Exceptions auslösen kann
} catch (ArithmeticException e) {
    // Behandlung arithmetischer Fehler
} catch (NullPointerException | IndexOutOfBoundsException e) {
    // Behandlung von Nullpointer- und Indexfehlern
} finally {
    // "Aufräumarbeiten", die immer auszuführen sind
}

Throws

Jede Methode kann festlegen, ob sie Exceptions mit catch fängt:

Scanner getScanner(String s) {
    try {
        return new Scanner(new File(s));
    } catch (FileNotFoundException e) {
        return null;
    }
}

Oder mit throws weitergibt:

Scanner getScanner(String s) throws FileNotFoundException {
    return new Scanner(new File(s));
}

Bei RuntimeExceptions darf die throws-Klausel weggelassen werden (der Compiler ergänzt diese automatisch).

Throw

class Test {
    public static void main(String[] args) throws Exception {
        // ...
        throw new Exception("Exception Text");
    }
}

Arten von Exceptions

Checked exceptions

  • Compiler verlangt, dass sie im ganzen Programm ordnungsgemäß mit catch abgefangen werden oder mit throws weitergeleitet werden
  • Beispiel: IOException, FileNotFoundException

Unchecked exceptions

  • Compiler verlangt keinen catch oder weiterleitung
  • Beispiel: RuntimeException (daraus werden alle unchecked exceptions abgeleitet), ArithmeticException (div by zero), NullPointerException

Einwickeln

Will man vermeiden, dass checked exceptions abgefangen oder weitergeleitet werden müssen, so kann man die checked exception “einwickeln”:

try {
    new Scanner(new File("Datei"));
} catch (FileNotFoundException e) { // checked exception
    throw new RuntimeException(e);  // unchecked exception
}