SpringBoot4.0新特性-Null-safety消灭空指针

核心目标

该机制的核心目标就是通过在编译时进行静态代码检查,防止运行时抛出空指针异常。SpringBoot4.0默认集成JSpecify框架,支持使用JSpecify注解来声明API、字段及相关类型的可空性。

举个例子,现在有一个接口和实现类:

java 复制代码
public interface TokenExtractorService {
    String extractToken(String input);
}
@Service
public class TokenExtractorServiceImpl implements TokenExtractorService {
    @Override
    public String extractToken(String input) {
        return input;
    }
}

我们想要在编译期就能表达:入参不允许为null,返回允许为null,该如何来做呢?

可空性设置

我们可以使用@NonNull和@Nullable注解来说明这些类型的可空性。具体来说可以有两种方式,显式设置和隐式统一设置。

显式设置可空性

只需要在参数和返回上分别添加对应的注解即可:

java 复制代码
public interface TokenExtractorService {
    @Nullable String extractToken(@NonNull String input);
}
@Service
public class TokenExtractorServiceImpl implements TokenExtractorService {
    @Override
    public @Nullable String extractToken(@NonNull String input) {
        return input;
    }
}
  • @NonNull:不能为空
  • @Nullable: 可以为空

加完这些标记以后,当我们调用这个方法的时候,IDEA就会有对应的错误提示:

java 复制代码
@GetMapping("/demo")
 public String demo(){
     String token = tokenExtractorService.extractToken(null);
     return token.toUpperCase();
 }

以上代码,IDEA会给出2个警告:

隐式设置可空性

大多数情况下,我们一般默认这些参数、返回、字段、类型都是非空的,因此只需要明确的说明可空即可,因此我们还可以在包级别统一设置默认的可空性,这个可以借助package-info.java来实现。

首先在service包下面添加package-info.java:

java 复制代码
@NullMarked
package com.github.xjs.service;
import org.jspecify.annotations.NullMarked;
  • @NullMarked:com.github.xjs.service这个包下面所有的参数、返回、字段、类型默认都是不允许为空
  • @NullUnmarked:默认都允许为空,一般很少用

此时,就可以删除代码中的@NonNull注解,只保留@Nullable即可:

java 复制代码
public interface TokenExtractorService {
    @Nullable String extractToken(String input);
}
@Service
public class TokenExtractorServiceImpl implements TokenExtractorService {
    @Override
    public @Nullable String extractToken(String input) {
        return input;
    }
}

更多关于可空性的话题,比如:如何设置数组、泛型的可空性,如何与CI/CD集成,如何忽略告警,请参考:SpringBoot4.0新特性-Null-safety消灭空指针

相关推荐
Sarvartha1 小时前
final 关键字
java·开发语言
2601_952047791 小时前
单一策略深度教程:用轻易云把集成任务的报错实时推送到钉钉机器人
java·机器人·钉钉
Joy T1 小时前
Spring AI 项目中的 pom.xml、application.yml 与 Nacos:从依赖管理到运行配置
spring·nacos·pom.xml·profile·参数配置·application.yml
数据狐(Datafox)2 小时前
淘宝图片搜索 API 落地实战:基于以图搜货搭建跨境电商选品系统
java·大数据·微服务
Escalating_xu4 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
灯澜忆梦4 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
一个风轻云淡4 小时前
GCC 和 GDB命令简单解读
java·linux·前端
省钱兄--zs4 小时前
西安24小时自助健身房解决方案实战:系统开发与部署全流程指南
java·spring boot·系统架构·intellij-idea·需求分析