news 2026/5/3 10:36:56

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot4.0新特性-Null-safety消灭空指针

核心目标

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

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

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注解来说明这些类型的可空性。具体来说可以有两种方式,显式设置和隐式统一设置。

显式设置可空性

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

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就会有对应的错误提示:

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

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

隐式设置可空性

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

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

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

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

public interface TokenExtractorService { @Nullable String extractToken(String input); } @Service public class TokenExtractorServiceImpl implements TokenExtractorService { @Override public @Nullable String extractToken(String input) { return input; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 10:17:25

建议收藏!AI大模型时代的高薪机会:10大岗位薪资与职业发展指南(附学习资源)_AI大模型的前十热门岗位薪资盘点!

文章盘点了AI大模型领域的10个热门高薪岗位,包括AI系统架构师、NLP专家、AI产品经理等,薪资范围从60万到200万不等。同时提供了系统学习AI大模型的资源,包括成长路线图、书籍、视频教程、项目实战和面试题等,帮助小白和程序员掌握…

作者头像 李华
网站建设 2026/5/1 12:09:20

基于云计算的实习管理系统设计与实现

目录 云计算实习管理系统的架构设计核心功能模块设计关键技术实现安全与性能优化方案系统特色与创新点 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 云计算实习管理系统的架构设计 采用B/S架构&#x…

作者头像 李华
网站建设 2026/5/1 14:10:03

小白也能懂:AI、大数据与大模型的区别与应用场景

本文系统解析了AI、大数据与大模型的本质区别与联系。大数据是历史数据集合,模型是数学预测函数,AI则是自动决策系统。三者呈层级关系:大数据为基础,模型为算法,AI为应用。通过采购场景实例,展示了从BI报表…

作者头像 李华
网站建设 2026/5/1 11:57:53

计算机毕业设计之springboot大学生综测可视化系统

大学生综测可视化系统是学校中重要的一环,大学生综测是教师、学生获取信息的主要渠道。于是经过考虑之后决定开发基于JAVA语言设计与实现了一款简洁、轻便的大学生综测可视化系统。本系统解决了大学生综测的主要问题,包括以下多个功能模块:学…

作者头像 李华
网站建设 2026/5/1 10:54:32

Device ID 19个字节 跟 计数器 21位组成 KSN最后5个字节!

二进制转换分析: 00 -> 0000 000003 -> 0000 0011c0 -> 1100 000000 -> 0000 00000f -> 0000 1111 组合成 40 位二进制流: 00000000 00000011 11000000 00000000 00001111 按位拆分: 前 19 位 (Device ID): 00000000 0000…

作者头像 李华