はい、チェックされた例外のラップを回避するメソッドを作成する方法があります。このユースケースの場合、これは完全に一致しますが、初心者を簡単に混乱させる可能性があるため、非常に注意する必要があります。ここにあります:
@SuppressWarnings("unchecked")
public static <T extends Throwable> void sneakyThrow(Throwable t) throws T {
throw (T) t;
}
そしてあなたはそれをとして使うでしょう
catch (Throwable t) { sneakyThrow(t); }
Joachim Sauerがコメントしたように、場合によっては、行の呼び出しsneakyThrow
によってメソッドが終了することをコンパイラーに納得させるのに役立ちます。宣言されたリターンタイプを変更するだけです。
@SuppressWarnings("unchecked")
public static <T extends Throwable> T sneakyThrow(Throwable t) throws T {
throw (T) t;
}
次のように使用します。
catch (Throwable t) { throw sneakyThrow(t); }
教育目的では、バイトコードレベルで何が起こっているかを確認するのは良いことです。からの関連スニペットjavap -verbose UncheckedThrower
:
public static <T extends java.lang.Throwable> java.lang.RuntimeException sneakyThrow(java.lang.Throwable) throws T;
descriptor: (Ljava/lang/Throwable;)Ljava/lang/RuntimeException;
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: athrow
Exceptions:
throws java.lang.Throwable
Signature: #13 // <T:Ljava/lang/Throwable;>(Ljava/lang/Throwable;)Ljava/lang/RuntimeException;^TT;
checkcast
指示がないことに注意してください。このメソッドは、合法的にthrowを宣言しT
ますが、これは任意の値にすることができますThrowable
。