Lombok基本注解之@SneakyThrows的作用
使用范围: 只能作用在方法和构造函数之上
文章图片
@SneakyThrows注解的作用得从java的异常设计体系说起。
java中常见的异常有两种:
- Exception即非运行时异常(编译异常)。
- RuntimeException即运行时异常。
但是现实,往往事与愿违。大部分情况下的异常,我们都是一路往外抛了事。所以渐渐的大家处理Exception的常见手段就是外面包一层RuntimeException,接着往上丢。这种解决思想尤其在Spring中到处出现。参见《Spring in Action》
try {} catch (Exception e) {throw new RuntimeException(e); }
【Lombok基本注解之@SneakyThrows的作用】Lombok的@SneakyThrows就是为了消除这样的模板代码。
使用注解后不需要担心Exception的处理
@SneakyThrowspublic 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 sneakyThrow(Throwable t) {if (t == null) throw new NullPointerException("t"); return Lombok.sneakyThrow0(t); }private static T sneakyThrow0(Throwable t) throws T {throw (T)t; }
总结 到此这篇关于Lombok基本注解之@SneakyThrows作用的文章就介绍到这了,更多相关Lombok注解@SneakyThrows内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 渗透测试|Metasploit(MSF)渗透测试框架使用教程及基本命令
- C++顺序表的基本操作实现
- Linux系统网络编程|Linux初阶(基本开发工具)
- MySQL|MySQL数据库的基本操作以及数据类型
- VUEX的基础
- 经典程序|利用C语言创建数据结构中链表的遍历及其基本操作
- kafka|kafka 第一次小整理(草稿篇)————分发的基本思路[三]
- MATLAB学习|MTALAB学习笔记——二三维图像的基本画法
- 深度学习|从0开始的深度学习——【tensorflow】如何生成一个基本张量
- 历时三个月,史上最详细的Spring注解驱动开发系列教程终于出炉了,给你全新震撼