Jakarta @Nonnull注解在IntelliJ中不生效,传入null未抛异常
为什么Jakarta @Nonnull注解没生效?
@Nonnull注解本身不会自动在运行时做非空校验,核心原因有这几点:
- 它本质是个编译期提示注解,只给IDE、静态代码分析工具(比如IntelliJ的代码检查、SpotBugs)用。比如在IntelliJ里传null时,编辑器会标黄警告,但这只是编码阶段的提醒,不会阻止程序运行,也不会在运行时抛出异常。
- Jakarta官方的@Nonnull没有内置运行时校验逻辑,它的作用是传递“这个参数不能为null”的语义信息,给开发者和工具链做参考,不是用来自动生成校验代码的。
- 要让它在运行时生效,得额外搭配AOP框架(比如AspectJ、Spring AOP)或者第三方校验库,通过动态代理或切面的方式,在方法调用前手动实现null检查逻辑。
解决办法
1. 手动加非空校验(最简单直接)
在方法开头自己判断参数是否为null,抛出异常:
import jakarta.annotation.Nonnull; public class test89 { public String processString(@Nonnull String input) { if (input == null) { throw new IllegalArgumentException("input 参数不能为null"); } return "Processed: " + input; } public static void main(String[] args) { test89 exampleService = new test89(); String result = exampleService.processString(null); System.out.println(result); } }
运行这段代码就会抛出IllegalArgumentException,符合预期的非空校验效果。
2. 用AspectJ实现自动校验
如果不想每个方法都手动写校验,可以用AspectJ定义切面,自动扫描所有带@Nonnull的参数并做检查:
import jakarta.annotation.Nonnull; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.reflect.MethodSignature; import java.lang.reflect.Parameter; @Aspect public class NonNullValidationAspect { @Before("execution(* *(.., @jakarta.annotation.Nonnull (*), ..))") public void validateNonNullParameters(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Parameter[] parameters = methodSignature.getMethod().getParameters(); for (int i = 0; i < parameters.length; i++) { if (parameters[i].isAnnotationPresent(Nonnull.class) && args[i] == null) { throw new IllegalArgumentException(parameters[i].getName() + " 不能为null"); } } } }
配置好AspectJ后,所有带@Nonnull注解的参数都会自动触发非空校验。
内容的提问来源于stack exchange,提问作者Giriraj
相关产品推荐
相关产品推荐

