Checked und Unchecked Exception: der Unterschied

Der Unterschied besteht darin, dass der Java Compiler für Checked Exceptions überprüft, ob diese entsprechend behandelt werden. Unchecked Exceptions sind dem Java Compiler egal.

Inhaltsverzeichnis

Was ist eine Checked Exception?

Checked Exceptions sind alle Exceptions die von der Klasse Exception erben, außer jenen, die von RuntimeException erben. Wie oben bereits erwähnt müssen Checked Exceptions entweder durch eine Angabe in der Methodensignatur mit dem throws-Keyword, oder durch Abfangen in einem try-catch Block behandelt werden. Java überprüft zur Compilezeit, ob die Exception entsprechend behandelt wird.

Beispiel

Die Methode Files.readFile() wirft eine IOException, welche eine Checked Exception ist. Wenn die Methode verwendet wird muss also die IOException behandelt werden. Zwei Möglichkeiten bieten sich an:

Angabe in der Signatur. Die Signatur sagt dem Java Compiler, dass die Exception einfach weitergereicht werden soll:

private static String getFileContent(String fileName) throws IOException {
        return Files.readFile(Paths.get(fileName).toFile());
}

Die zweite Möglichkeit ist, die Exception direkt in der Methode in einem try-catch Block abzufangen und zu behandeln:

private static String getFileContent(String fileName) {
    try {
        return Files.readFile(Paths.get(fileName).toFile());
    } catch (IOException e) {
        // exception handling etc.
        return "";
    }
}

In diesem Fall wird ein leerer String zurückgegeben falls eine IOException oder eine ihrer Unterklassen (z.B. FileNotFoundException) auftritt.

Was ist eine Unchecked Exception?

Unchecked Exceptions sind solche, die "ohne Ankündigung" geworfen werden können, also nicht in einer Methodensignatur angegeben werden. Bekannte Beispiele von Unchecked Exceptions sind ArrayIndexOutOfBoundsException, IllegalArgumentException oder NullPointerException. Diese Exceptions erben von RuntimeException, was den Effekt hat, dass die Angabe in der Signatur nicht notwendig ist.

Beispiel

public static void main(String[] args) {
    List list = Arrays.asList("Bier");
    list.get(2);
}

Der Aufruf von list.get(2) versucht auf einen nicht vorhandenen Index zuzugreifen, was eine ArrayIndexOutOfBoundsException zur Folge hat. Wie man im Beispiel sieht, muss die Exception nicht behandelt werden. Dem Java Compiler ist dabei egal ob die Exception in der Signatur der aufgerufenen Methode vorhanden ist:

public static void main(String[] args) {
    Integer.parseInt("Bier statt Zahlen");
}

Obwohl die Methode Integer.parseInt() die NumberFormatException mittels throws angegeben hat, zwingt uns der Java Compiler nicht, die Exception zu behandeln.


Ähnliche Artikel