Lombok基本注解之@SneakyThrows的作用

网友投稿 1954 2022-11-06

Lombok基本注解之@SneakyThrows的作用

Lombok基本注解之@SneakyThrows的作用

使用范围: 只能作用在方法和构造函数之上

@SneakyThrows注解的作用得从java的异常设计体系说起。

java中常见的异常有两种:

Exception即非运行时异常(编译异常)。RuntimeException即运行时异常。

第一种会强制要求抛出它的方法声明throws,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。设计的目的是为了提醒开发者处理一些场景中必然可能存在的异常情况。比如网络异常造成IOException。

但是现实,往往事与愿违。大部分情况下的异常,我们都是一路往外抛了事。所以渐渐的大家处理Exception的常见手段就是外面包一层RuntimeException,接着往上丢。这种解决思想尤其在Spring中到处出现。参见《Spring in Action》

try {

} catch (Exception e) {

throw new RuntimeException(e);

}

Lombok的@SneakyThrows就是为了消除这样的模板代码

使用注解后不需要担心Exception的处理

@SneakyThrows

public void utf8ToString(byte[] bytes) {

return new String(bytes, "UTF-8");

}

真正生成的代码

public void utf8ToString(byte[] bytes) {

try {

return new String(bytes, "UTF-8");

} catch (Exception e) {

throw Lombok.sneakyThrow(e);

}

}

原理:

显然魔法藏在throw Lombok.sneakyThrow(e); 中。可能大家都会以为这个方法就是new RuntimeException()之类的。然而事实并非如此。阅读代码可以看出整个方法其实最核心的逻辑是throw (T) t;,利用泛型将我们传入的Throwable强转为RuntimeException。虽然事实上我们不是RuntimeException。但是没关系,因为JVM并不关心这个。泛型最后存储为字节码时并没有泛型的信息。这样写只是为了骗过javac编译器。

public static RuntimeException snehttp://akyThrow(Throwable t) {

if (t == null) throw new NullPointerException("t");

return Lombok.sneakyThrow0(t);

}

private static T sneakyThrow0(Throwable t) throws T {

throw (T)t;

}

总结

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring Bean Scope 有状态的Bean与无状态的Bean
下一篇:springboot 事务的七种传播方式的最全测试讲解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~