Java: Throw checked exceptions without throws clause
Code that potentially throws checked exceptions, is often processed within a try-catch block. Two posibilities exist to forward caught exception to the caller:
- Wrap checked exception into an instance of
RuntimeException
. - Declare a
throws
-clause
Both may be undesired. This article describes a technice to throw checked exceptions without the need of either. The technique is called throw sneaky. It is implemented as a static method:
@SuppressWarnings("unchecked") public static <E extends Exception, R> R throwSneaky(Exception e) throws E { throw (E) e; }
The code makes use of two things:
- The difference between checked and unchecked exceptions only exists during compile time.
- The potentially thrown checked Exception is hidden from the compiler with the help of Generics.
The following code sample will illustrate usage:
public static void main(String[] args) { try { new FileInputStream("nonexistent"); } catch (FileNotFoundException e) { // Checked exception can be thrown // without throws clause. throwSneaky(e); } }
The technique described is inspired by a thread on stackoverflow.com.
Although it does not spare you the try-catch-Block. This is addressed by Project Lombok
with the Annotation @SneakyThrows
.