Lombok基本注解之@SneakyThrows的作用

 更新时间:2022年01月20日 10:19:18   作者:夜雨微澜醉挽清风  
@SneakyThrows注解是由lombok为咱们封装的,它能够为咱们的代码生成一个try...catch块,并把异常向上抛出来,下面这篇文章主要给大家介绍了关于Lombok基本注解之@SneakyThrows作用的相关资料,需要的朋友可以参考下

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

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

java中常见的异常有两种:

  1. Exception即非运行时异常(编译异常)。
  2. 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中使用双向链表实现贪吃蛇程序源码分享

    java中使用双向链表实现贪吃蛇程序源码分享

    这篇文章主要介绍了java中使用双向链表实现贪吃蛇程序源码分享,本文直接给出了实现代码,需要的朋友可以参考下
    2015-03-03
  • 基于EasyExcel实现百万级数据导入导出详解

    基于EasyExcel实现百万级数据导入导出详解

    大数据的导入和导出,相信大家在日常的开发、面试中都会遇到。本文将为大家详细介绍一下如何利用EasyExcel实现百万级数据导入导出,需要的可以参考一下
    2023-01-01
  • 细谈java同步之JMM(Java Memory Model)

    细谈java同步之JMM(Java Memory Model)

    Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。下面我们来一起学习下JMM
    2019-05-05
  • 详解springBoot启动时找不到或无法加载主类解决办法

    详解springBoot启动时找不到或无法加载主类解决办法

    这篇文章主要介绍了详解springBoot启动时找不到或无法加载主类解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Spring JDBC使用步骤和事务管理

    Spring JDBC使用步骤和事务管理

    Spring JDBC是Spring框架用来处理关系型数据库的模块,对JDBC的API进行了封装,这篇文章主要介绍了Spring JDBC使用步骤和事务管理,需要的朋友可以参考下
    2023-12-12
  • SpringData Repository接口用法解析

    SpringData Repository接口用法解析

    这篇文章主要介绍了SpringData Repository接口用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • maven中profile动态打包不同环境配置文件的实现

    maven中profile动态打包不同环境配置文件的实现

    开发项目时会遇到这个问题:开发环境,测试环境,生产环境的配置文件不同, 打包时经常要手动更改配置文件,本文就来介绍一下maven中profile动态打包不同环境配置文件的实现,感兴趣的可以了解一下
    2023-10-10
  • Java选择排序和垃圾回收机制详情

    Java选择排序和垃圾回收机制详情

    这篇文章主要介绍Java选择排序和垃圾回收机制,创建对象就会占据内存,如果程序在执行过程中不能再使用某个对象,这个对象是徒耗内存的垃圾,下面来看看文章具体内容吧
    2021-10-10
  • java 使用poi动态导出的操作

    java 使用poi动态导出的操作

    这篇文章主要介绍了java 使用poi动态导出的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Aop动态代理和cglib实现代码详解

    Aop动态代理和cglib实现代码详解

    这篇文章主要介绍了Aop动态代理和cglib实现代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12

最新评论