方法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