Lombok 使用教程-@NonNull | 如何优雅的处理字段 NullPointerException 异常

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

一、简介

@NonNulllombok v0.11.10中被引入。

你可以在一个记录组件上使用@NonNull,或者一个方法或构造函数的参数。lombok将为你生成一个null检查语句。

Lombok始终将字段上通常命名为@NonNull的各种注释视为一个信号,以便在Lombok为您生成整个方法或构造函数时生成null检查,例如通过@Data。但是,对参数或记录组件使用lombok自己的@lombok.NonNull会导致在该方法的顶部插入null检查。

null检查看起来像if (param == null) throw new NullPointerException("param is marked @NonNull but is null"); 并将被插入到方法的最顶端。对于构造函数,null检查将被插入到任何明确的this()super()调用之后。对于记录组件,null检查将被插入到 "紧凑构造函数 "中(完全没有参数列表的构造函数),如果你没有构造函数,它将被生成。如果你已经写出了长形式的记录构造函数(参数与你的组件完全匹配),那么什么也不会发生–你将不得不注释这个长形式构造函数的参数。

如果顶部已经有一个null检查,则不会产生额外的null检查。

二、示例比较

1. Lombok 写法

    import lombok.NonNull;
    
    public class NonNullExample extends Something {
      private String name;
      
      public NonNullExample(@NonNull Person person) {
        super("Hello");
        this.name = person.getName();
      }
    }

2. Java 标准写法

    import lombok.NonNull;
    
    public class NonNullExample extends Something {
      private String name;
      
      public NonNullExample(@NonNull Person person) {
        super("Hello");
        if (person == null) {
          throw new NullPointerException("person is marked @NonNull but is null");
        }
        this.name = person.getName();
      }
    }

三、支持的配置项

lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException | JDK | Guava | Assertion] (默认: NullPointerException).

lombok生成一个null检查if语句时,默认情况下,会抛出一个java.lang.NullPointerException,并将 "字段名 is marked non-null but is null"作为异常信息。然而,你可以在这个配置键中使用IllegalArgumentException,让lombok用这个消息来代替抛出这个异常。通过使用Assertion,将生成一个具有相同消息的assert语句。JDKGuava键的结果是调用这两个框架的标准null检查方法:java.util.Objects.requireNonNull([field name], "[field name] is marked non-null but is null");或者com.google.common.base.Preconditions.checkNotNull([field name], [field name] is marked non-null but is null");分别。

lombok.nonNull.flagUsage = [warning | error] (默认: 未设置)

如果配置了,Lombok会将@NonNull的任何使用标记为warningerror

四、附属说明

Lombok对于已经存在null检查的检测方案,包括扫描if语句或assert语句,这些语句看起来就像lombok自己的。任何作为if语句的 "then "部分的 "throws "语句,无论是否在大括号中,都算在内。对任何名为requireNonNullcheckNotNull的方法的调用都算。if语句的条件必须与PARAMNAME == null完全一致;assert语句必须与PARAMNAME != null完全一致。对requireNonNull风格的方法的调用必须是独立的(一个只是调用该方法的语句),或者必须是赋值或变量声明语句的表达。你的方法中的第一个语句如果不是这样的null检查,就会停止检查null检查的过程。

虽然@Data和其他方法生成的lombok注解会在各种众所周知的注解上触发,这些注解标志着字段决不能是@NonNull,但这个功能只在lombok包中的lombok自己的@NonNull注解上触发。

在一个原始参数上的@NonNull会导致一个警告。将不会生成空值检查。

在一个抽象方法的参数上的@NonNull曾经产生一个警告;从1.16.8版本开始,这种情况不再出现,以承认@NonNull也有文档作用的概念。出于同样的原因,你可以将一个方法注释为@NonNull;这是允许的,不产生警告,也不产生任何代码。

参考文献

【1】@NonNull

  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值