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 sneakyThrow(Throwable t) { if (t == null) throw new NullPointerException("t"); return Lombok.<RuntimeException>sneakyThrow0(t); } private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T { throw (T)t; }
总结
到此这篇关于Lombok基本注解之@SneakyThrows作用的文章就介绍到这了,更多相关Lombok注解@SneakyThrows内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
MyBatis_Generator插件的安装以及简单使用方法(图解)
下面小编就为大家带来一篇MyBatis_Generator插件的安装以及简单使用方法(图解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-05-05SpringBoot项目中建议关闭Open-EntityManager-in-view原因
这篇文章主要为大家解析了在Spring Boot项目中建议关闭Open-EntityManager-in-view的原因示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助2022-02-02springboot实现FastJson解析json数据的方法
本篇文章主要介绍了springboot实现FastJson解析json数据的方法,非常具有实用价值,需要的朋友可以参考下2017-04-04Java判断object对象为空(包括null ,““)的方法
这篇文章主要介绍了Java判断对象是否为空(包括null ,“”)的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-12-12
最新评论