news 2026/6/10 13:20:25

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/6/9 22:27:25

【软考】系统分析师-论文范文(二)

论软件需求获取技术及应用 软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的期望。软件需求获取是一个确定和理解不同的项目干系人的需求和约束的过程。需求获取是否科学、准备充分,对获取的结果影响很大,这是因为大部分用户无法完整地描述…

作者头像 李华
网站建设 2026/6/10 16:02:15

旧安卓手机别扔!KSWEB 搭博客,搭配 cpolar 轻松实现公网访问

KSWEB 作为安卓端轻量级 Web 服务器,核心功能是提供 PHP、MySQL 运行环境,能快速部署 Typecho、WordPress 等博客系统,适配安卓 5.0 及以上的老旧机型,比如小米红米、华为畅享系列都能用上,它的优点很突出 —— 硬件需…

作者头像 李华
网站建设 2026/6/10 15:46:13

开题报告 springboot和vue-基于SSH框架的寄卖管理系统的设计与实现

目录 基于SSH框架的寄卖管理系统开题报告(SpringBoot与Vue技术栈)系统背景与意义技术选型说明核心功能模块系统架构设计创新点与难点预期成果 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同…

作者头像 李华
网站建设 2026/6/5 20:35:59

当 UI 自动化遇上 AI:一次来自飞猪的一线工程升级

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 很多团队开始做 AI 自动化测试,往往是从一个很具体、也很痛的现实问题出发的。 不是“我们要用 AI”,而是——原来的自动化,已经很难支撑业务了。 在 …

作者头像 李华
网站建设 2026/6/10 14:09:14

kotlin和compose中使用by

by 是 Kotlin 中的一个关键字,表示委托(delegation)。它的含义是:“将这个属性的 getter 和 setter 委托给另一个对象处理”。 1. 基本概念 // 没有 by:直接赋值 val a "Hello" // a 存储字符串…

作者头像 李华
网站建设 2026/6/10 16:02:57

开题报告 springboot和vue电子万年历

目录技术栈概述系统功能模块技术实现要点特色功能扩展项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈概述 SpringBoot和Vue结合的电子万年历系统采用前后端分离架构。SpringBoot作为后端框架提供RE…

作者头像 李华