方法1:
This post by 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
是erased並且沒有意義。
正如你所說,做這樣的事情是一個巨大的破解,你應該很好地記錄它的使用。
方法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());
幸得this answer上後https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafe。我想我會提到完整性,但它可能更好只是使用上面的技巧,而不是允許Unsafe
進入您的代碼。
方法3:
在鏈接答案的評論有關使用過時的方法Thread.stop(Throwable)
使用Unsafe
,@bestsss points out一個更簡單的把戲:
Thread.currentThread().stop(new Exception());
在這種情況下,你會使用@SuppressWarnings("deprecation")
並再次證明文件非常激烈。再次,我更喜歡它的(相對)清潔度的第一招。
您正在測試的東西,是不可能發生的。爲什麼? – rodrigoap 2012-08-13 22:13:46
我試圖用LogicalHandler來模擬soap響應。 handleMessage(LogicalMessageContext上下文)不會聲明拋出異常。但是,所有由soap結束點引發的異常都是Exceptions的子類。我需要拋出這些異常來模擬我的服務響應。 –
2012-08-13 22:16:46
如果您有興趣,請查看我的編輯。 – 2012-09-06 00:31:55