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

(0)

相关推荐

  • 详解Lombok快速上手(安装、使用与注解参数)

    Lombok插件安装与使用说明 在实习中发现项目中IDE一直报检查错误,原来是使用了Lombok注解的黑科技,这里整理了一些日常编码中能遇到的所有关于它的使用详解,其实lombok项目的产生就是为了省去我们手动创建getter和setter方法等等一些基本组件代码的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter方法.即它最终能够达到的效果是:在源码中没有getter和setter等组件方法,但是在编译生成的字节码文件中有getter和setter等组件方法. 常见参数

  • lombok注解介绍小结

    lombok注解介绍 lombok注解文档 lombok官网下载 lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁,当然,这带来的副作用就是不易阅读-不过,还是能看得懂吧,废话不多说,先看一下lombok支持的一些常见的注解. @NonNull @Cleanup @Getter/@Setter @ToString @EqualsAndHashCode @

  • Lombok的@Data等注解无效的解决

    一.已定义好的实体类 二.调用时没有get,set访问器 在用@Data注解时,没有生成setter/getter方法.百度了一堆都没解决方法,后来用Google查了一下解决了~~~ 使用IDEA需要安装Lombok插件,我这里已经下载好,如果没下载安装点击install进行下载安装即可~~~ 到此这篇关于Lombok的@Data等注解无效的解决的文章就介绍到这了,更多相关Lombok的@Data注解无效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • Java中lombok的@Builder注解的解析与简单使用详解

    Lombok中@Builder用法 1.建造者模式简介:Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 2.注解类Builder.java注释: * The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class  * that contains a mem

  • 解决Lombok注解不起作用的问题

    Lombok注解不起作用 场景: 减少实体类中如Getter,Setter方法的书写 原因: lombok是一个第三方插件,我们使用时需要进行两个步骤(两个步骤缺一不可): 1:引入lombok依赖 2: 安装lombok插件 作用: Lombok是一个第三方插件,通过它我们可以直接书写注解来代替原来的getter,setter,toString等方法. 深入理解Lombok 说道Lombok,可能会鲜为人知.但是在实际的开发中,它起到了很大的作用,话不多说,直入正题: 一.Lombok是什么

  • Lombok基本注解之@SneakyThrows的作用

    使用范围: 只能作用在方法和构造函数之上 @SneakyThrows注解的作用得从java的异常设计体系说起. java中常见的异常有两种: Exception即非运行时异常(编译异常). RuntimeException即运行时异常. 第一种会强制要求抛出它的方法声明throws,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过.设计的目的是为了提醒开发者处理一些场景中必然可能存在的异常情况.比如网络异常造成IOException. 但是现实,往往事与愿违.大部分情况下的异

  • Java中Lombok @Value注解导致的variable not been initialized问题

    目录 背景 解决 背景 想要修改一个POJO类,在其中增加一个字段,但是增加以后就开始报错: 该类已经存在一个构造函数,为了不破坏该类原来的使用方式,于是重新写了一个构造方法,之前的构造函数未改动. 该类被Lombok的@Value注解修饰 解决 报错信息显示,变量未被初始化.于是主要排查是否有被初始化. 在重写的构造方法中,我已经对该变量进行了初始化. 不明所以,开始找不同,这个类中,唯一不熟悉的就是@Value注解,于是查看注解中的注释: /** * Generates a lot of c

  • 解决在Idea 2020.2下使用 Lombok的注解不生效的问题(插件安装了,依赖也写了,自动注解也设置了)

    如题必要条件都有但还是不能生效 虽然不是灰色,但是还是可以看到上面的导包是灰色的,并且没有任何报错. 而且可以看到上面正常正确的类是有图标的,但是Test这个类没有.在其他类里面也是不能引用get/set方法的,在一顿百度和折腾之后还是没有找到正确的解决方法,无奈之下重启后发现问题解决. 正常情况下不应该出现这种问题,连图标都没有,可能是Idea 2020.2版本的BUG.,反正我是除了重启没有找到解决办法. 下载这个版本的lombok就OK了,我没有经过任何修改,可以放心下载,如果不放心的可以

  • 减少代码开发工作的Java库lombok及注解的使用学习

    目录 前言 Lombok是什么 安装 对于eclipse 对于 IDEA QuickStart @Setter/@Getter @ToString exclude 参数 doNotUseGetters 参数 includeFieldNames参数 callSuper 参数 @NonNull @EqualsAndHashCode 参数 @Data @Cleanup @NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor @Va

  • spring使用aspect注解切面不起作用的排查过程及解决

    今天做spring使用aspect注解demo,发现不起作用,问题排查如下: 1.程序正常启动,说明jar包依赖没有问题 2.debug程序不进入切面,有可能是路径问题,根据这个思路,果真是路径问题,在切面配置类的使用@ComponentScan的路径写错了. 扫描的路径为:注解类.切面类及service的上一层目录即可,假设项目的结构如下: 则@ComponenScan("demo.com.nrt")即可 SpringBoot切面@aspect--- 注解在嵌套方法不生效的问题 例如

  • 使用Lombok @Builder注解导致默认值无效的问题

    目录 @Builder注解导致默认值无效 原因分析 lombok@Builder忽略属性默认值的坑点 1. 简单使用 2. 默认值问题 3. 修改属性值 @Builder注解导致默认值无效 使用Lombok注解可以极高的简化代码量,比较好用的注解除了@Data之外,还有@Builder这个注解,它可以让你很方便的使用builder模式构建对象,但是今天发现@Builder注解会把对象的默认值清掉. 像下面这段代码,会导致对象的name属性变为null: public class BuilderT

  • Intellij IDEA 2017.3使用Lombok及常用注解介绍

    前言 不知道大家在创建一个实体类的时候,有没有发现每次定义好属性之后,都需要手动右键Generate构建getter.setter和toString()之类的方法,假设很多实体类的话,工程量就增加了,为提高开发效率且代码优雅,特给大家推荐一下Lombok神器. 简介 Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而为您的Java增光添彩.永远不需要再写另一个getter或equals方法,带有一个注释之后您的类有一个功能全面的生成器,自动化您的日志记录变量等等. 使用

  • 聊聊Lombok中的@Builder注解使用教程

    目录 Lombok中的@Builder注解的使用 作用 引入依赖 第二步给实体类加上@Builder注解 第三步使用测试使用@Builder注解生成对象 实体类加上@Builder注解之后的编译结果 Lombok中的@Builder注解的使用 作用 @Builder注解的作用主要是用来生成对象,并且可以为对象链式赋值. 引入依赖 因为@Builder注解是lombok中的东西,所以第一步我们需要引入lombok的依赖,如下图: 第二步给实体类加上@Builder注解 第二步我们需要给我们的实体类

  • spring注解 @Valid 的作用说明

    目录 spring注解 @Valid 的作用 在userRequest类中的属性上使用spring的注解 spring注解 @Valid 作用范围 建立两个基本类 建立一个请求 实验测试 修改UserRequest(对users加入@Valid) 再次发送请求 可以看到Valid生效,此时加上name的值 spring注解 @Valid 的作用 在controller中的方法上面写有注解@Valid UserRequest 的作用. 备注:这里一个@Valid的参数后必须紧挨着一个Binding

随机推荐