方法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被声明为
throwsE,编译器认为特定的调用可能会抛出
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());
值得信赖的是在帖子[http://codingdict.com/questions/4269)上的答案。我以为是出于完整性的考虑而提到了它,但是最好使用上面的技巧而不是允许您的代码进入。
Unsafe
方法3:
在有关使用的链接答案的注释中
Unsafe,@bestsss指出了不建议使用的方法简单得多的技巧
Thread.stop(Throwable):
Thread.currentThread().stop(new Exception());
在这种情况下,您将
@SuppressWarnings("deprecation")非常猛烈地使用并再次进行记录。同样,我比较喜欢它的(相对)清洁度。


