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 sneakyThrowAufruf des Compilers in Ordnung ist. Auf welchen möglichen Typ wurde geschlossen, Twenn kein ungeprüfter Ausnahmetyp erwähnt wird?
Zweitens, wenn man akzeptiert, dass dies funktioniert, warum beschwert sich der Compiler dann über den nonSneakyThrowAufruf? Sie scheinen sich sehr ähnlich zu sein.
sneakyThrowAnruf meinen . Die besonderen Bestimmungen über den Rückschluss vonthrows TFormularen gab es in der Spezifikation von Java 7 nicht.