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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JVM内存飙升线上问题排查方式

    JVM内存飙升线上问题排查方式

    文章主要介绍了线上CMS服务内存增长问题的排查过程,通过分析GC日志和堆栈快照,定位问题为Nacos的NamingService对象无法回收和MySQL的CallableStatement对象增长迅速,最终通过将NamingService改为单例模式解决了内存增长问题
    2025-03-03
  • Java中 log4j日志级别配置详解

    Java中 log4j日志级别配置详解

    这篇文章主要介绍了Java中 log4j日志级别配置详解,需要的朋友可以参考下
    2018-01-01
  • 如何解决org.apache.jasper.JasperException:无法为JSP编译类详解

    如何解决org.apache.jasper.JasperException:无法为JSP编译类详解

    这篇文章主要给大家介绍了关于如何解决org.apache.jasper.JasperException:无法为JSP编译类的相关资料,原因可能是JSP文件的语法错误、类路径问题或其他配置问题,建议检查JSP文件的语法、类路径配置和其他相关配置,需要的朋友可以参考下
    2023-06-06
  • SpringBoot2.1.4中的错误处理机制

    SpringBoot2.1.4中的错误处理机制

    这篇文章主要介绍了SpringBoot2.1.4中的错误处理机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • springboot项目打成jar包后无法获取static下的静态资源文件的问题分析

    springboot项目打成jar包后无法获取static下的静态资源文件的问题分析

    这篇文章主要介绍了springboot项目打成jar包后无法获取static下的静态资源文件的问题分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java中AIO、BIO、NIO应用场景及区别

    Java中AIO、BIO、NIO应用场景及区别

    本文主要介绍了Java中AIO、BIO、NIO应用场景及区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • springsecurity基于token的认证方式

    springsecurity基于token的认证方式

    本文主要介绍了springsecurity基于token的认证方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 如何理解Java线程池及其使用方法

    如何理解Java线程池及其使用方法

    线程池是首先创建一些线程,它们的集合称为线程池。使用线程池可以提高性能,它在系统启动时创建大量空闲的线程,程序将一个任务传给线程池,它就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务
    2021-06-06
  • MyBatis中执行SQL语句的几种方式总结

    MyBatis中执行SQL语句的几种方式总结

    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,下面这篇文章主要给大家介绍了关于MyBatis中执行SQL语句的几种方式,需要的朋友可以参考下
    2024-04-04
  • 使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)

    使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)

    这篇文章主要介绍了使用IDEA搭建SSM框架的详细教程 spring + springMVC +MyBatis,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05

最新评论