方法 1:
Alexey Ragozin によるこの投稿では、ジェネリック トリックを使用して宣言されていないチェック済み例外をスローする方法について説明しています。その投稿から:
public class AnyThrow {
public static void throwUnchecked(Throwable e) {
AnyThrow.<RuntimeException>throwAny(e);
}
@SuppressWarnings("unchecked")
private static <E extends Throwable> void throwAny(Throwable e) throws E {
throw (E)e;
}
}
トリックは、型がへの呼び出しでthrowUnchecked
あるというコンパイラへの「嘘」に依存しています。は として宣言されているため、コンパイラは、特定の呼び出しが単に をスローできると考えます。もちろん、任意に宣言してやみくもにキャストすることでこのトリックが可能になり、呼び出し元が引数のキャスト先を決定できるようになります。実行時には消去され、意味がありません。E
RuntimeException
throwAny
throwAny
throws E
RuntimeException
throwAny
E
E
あなたが指摘したように、そのようなことを行うことは巨大なハックであり、その使用法を非常によく文書化する必要があります.
方法 2:
この目的のためにも使用できますsun.misc.Unsafe
。最初に、リフレクションを使用してそのクラスのインスタンスを返すメソッドを実装する必要があります。
private static Unsafe getUnsafe() {
try {
Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
return (Unsafe)theUnsafeField.get(null);
}
catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
呼び出しUnsafe.getUnsafe()
は通常SecurityException
. のインスタンスをUnsafe
取得したら、その恐ろしい機能を使用できます。
Unsafe unsafe = getUnsafe();
unsafe.throwException(new Exception());
クレジットは、投稿https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafeのこの回答に送られます。完全を期すためにこれについて言及したいと思いましたが、コードに許可するのではなく、上記のトリックを使用する方がおそらく良いでしょう.Unsafe
方法 3:
usingに関するリンクされた回答のコメントでUnsafe
、 @bestsssは非推奨の method を使用したはるかに簡単なトリックを指摘しThread.stop(Throwable)
ています。
Thread.currentThread().stop(new Exception());
この場合、@SuppressWarnings("deprecation")
非常に激しく文書化します。繰り返しますが、私は (相対的な) 清潔さのために最初のトリックを好みます。