news 2026/10/15 11:05:28

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;
  • @NullMarked:com.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/10/15 6:20:40

基于云计算的微课教学资源共享平台建设_开题报告 springboot和vue_

目录 技术栈选择依据平台架构设计核心功能模块关键技术实现性能优化方案测试部署流程 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 技术栈选择依据 SpringBoot作为后端框架具备快速开发、内嵌服务器和…

作者头像 李华
网站建设 2026/10/14 8:08:45

大模型性能倍增器:MoE架构详解,收藏级教程!

文章介绍了MoE(专家混合)模型,这是一种在保持计算开销不变的情况下增加模型参数规模的技术。MoE通过引入稀疏性,将Transformer中的FFNN改造成多专家网络,包括Router(负责分配任务)和多个Experts…

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

强烈安利! AI论文工具 千笔 VS 灵感ai,本科生写作神器!

随着人工智能技术的迅猛发展,AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要助手。越来越多的本科生开始借助这些工具提升写作效率、优化内容结构,甚至降低查重压力。然而,面对市场上种类繁多、功能各异的AI写作工具,许多学…

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

探索成熟量产伺服控制器方案:以汇川ISP500伺服为例

成熟量产伺服控制器方案 汇川ISP500伺服,提供DSP程序和原理图,代码完整,学习工业代码的范例,含惯量识别,电机参数识别,PWM死区补偿,运动插补等功能。 在工业自动化领域,伺服控制器扮…

作者头像 李华
网站建设 2026/10/15 7:08:23

Compose 中的状态可变性体系

您说得非常对&#xff01;您的直觉是正确的。Compose 确实有类似 Kotlin 集合的可变/不可变概念&#xff0c;但是实现方式不同。 1. Compose 中的状态可变性体系 Kotlin 集合的类比&#xff1a; // Kotlin 集合 val immutableList: List<String> listOf("A"…

作者头像 李华