Java: Checked Exceptions ohne throws-Klausel
Code, der potenziell checked Exceptions wirft, wird of innerhalb eines try-catch-Blocks aufgerufen. Es existieren zwei Möglichkeiten, die Exception weiter zu werfen:
- Die Exception in eine Instanz von
RuntimeException
wrappen. - Eine
throws
-Klausel deklarieren.
Beide Möglichkeiten können unerwünscht sein. In diesem Artikel wird eine Technik beschrieben, die beides unnötig macht. Sie wird throw sneaky genannt. Sie ist als statische Methode implementiert:
@SuppressWarnings("unchecked")
public static <E extends Exception, R> R throwSneaky(Exception e)
throws E {
throw (E) e;
}
Der Code macht sich zwei Dinge zunutze:
- Der Unterschied zwischen checked und unchecked Exceptions existiert nur zur Compilezeit.
- Die potenziell geworfene checked Exception wird mit Hilfe von Generics versteckt.
Dazu folgendes Anwendungsbeispiel:
public static void main(String[] args) {
try {
new FileInputStream("nonexistent");
} catch (FileNotFoundException e) {
// Checked exception can be thrown
// without throws clause.
throwSneaky(e);
}
}
Die beschriebene Technik ist durch einen Thread auf stackoverflow.com inspiriert. Sie spart einem aber nicht den try-catch
-Block. Hier hilft die Annotation @SneakyThrows
im Project Lombok.