Java: Checked Exceptions ohne throws-Klausel

Footballspieler werfen/fangen Ball
Footballspieler werfen/fangen Ball | zugeschnitten |  © Wikimedia Commons | CC BY-SA 2.0 Deed 

Code, der potenziell checked Exceptions wirft, wird of innerhalb eines try-catch-Blocks aufgerufen. Es existieren zwei Möglichkeiten, die Exception weiter zu werfen:

  1. Die Exception in eine Instanz von RuntimeException wrappen.
  2. 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:

  1. Der Unterschied zwischen checked und unchecked Exceptions existiert nur zur Compilezeit.
  2. 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.