Beim Schreiben von Code für eine andere Antwort auf dieser Site bin ich auf diese Besonderheit gestoßen:
static void testSneaky() {
final Exception e = new Exception();
sneakyThrow(e); //no problems here
nonSneakyThrow(e); //ERRROR: Unhandled exception: java.lang.Exception
}
@SuppressWarnings("unchecked")
static <T extends Throwable> void sneakyThrow(Throwable t) throws T {
throw (T) t;
}
static <T extends Throwable> void nonSneakyThrow(T t) throws T {
throw t;
}
Erstens bin ich ziemlich verwirrt, warum der sneakyThrow
Aufruf des Compilers in Ordnung ist. Auf welchen möglichen Typ wurde geschlossen, T
wenn kein ungeprüfter Ausnahmetyp erwähnt wird?
Zweitens, wenn man akzeptiert, dass dies funktioniert, warum beschwert sich der Compiler dann über den nonSneakyThrow
Aufruf? Sie scheinen sich sehr ähnlich zu sein.
sneakyThrow
Anruf meinen . Die besonderen Bestimmungen über den Rückschluss vonthrows T
Formularen gab es in der Spezifikation von Java 7 nicht.