栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

当您的方法签名不允许抛出异常时,如何抛出异常?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

当您的方法签名不允许抛出异常时,如何抛出异常?

方法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")
非常猛烈地使用并再次进行记录。同样,我比较喜欢它的(相对)清洁度。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/455539.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号