今天编写一段代码后,编译发现报 未知的枚举常量 javax.annotation.meta.When.MAYBE
警告,回顾代码,未发现程序中有相关引用。百思不得解 ????
场景复现
网上一阵搜索,代码一阵调整, 最终发现是 @Nullable
注解的问题。当使用 spring 的 @Nullable
时,编译代码会报 未知的枚举常量 javax.annotation.meta.When.MAYBE
异常。
代码:
import org.springframework.lang.Nullable;
public class Test {
public void tet(@Nullable String name) {
System.out.println(name);
}
}
编译结果:
[WARNING] 未知的枚举常量 javax.annotation.meta.When.MAYBE 原因: 找不到javax.annotation.meta.When的类文件
解决方法
经实验发现了 3 种解决方法:
-
删除
@Nullable
注解从代码中删除
@Nullable
注解,在编译时就不会有该警告信息import org.springframework.lang.Nullable; public class Test { public void tet(@Nullable String name) { System.out.println(name); } }
-
用 jakarta 的
@Nullable
使用 jakarta 的
@Nullable
替换 spring 的@Nullable
也可解决该问题,代码如下import jakarta.annotation.Nullable; public class Test { public void tet(@Nullable String name) { System.out.println(name); } }
使用该解决方案时,如需同时引用 spring 的
@NonNull
注解时,看起会稍显别扭。当然此时 spring 的@NonNull
注解也可使用 jakarta 的@Nonnull
注解代替,这样看起来会舒服些。import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; import org.springframework.lang.NonNull; public class Test { public void tet(@Nullable String name, @NonNull String code, @Nonnull String Id) { System.out.println(name); } }
-
通过引入第三方 jar 包来解决
-
JSR305 包
-
google JSR305包
<dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> <version>3.0.2</version> </dependency>
-
sourceforge JSR305包
<dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>jsr305</artifactId> <version>1.3.7</version> </dependency>
-
-
annotations 包
<dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>annotations</artifactId> <version>3.0.1</version> </dependency>
-
@Nullable
注解说明
@Nullable
是一种用于标记 【方法参数】、【方法返回值】 、【字段】的注解,用于表示这些元素可以为null。它主要用于静态代码分析工具、IDE或其他工具来检测潜在的空指针异常问题。
使用 @Nullable
注解可以提高代码的可读性,并帮助静态代码分析工具识别潜在的空指针异常问题。但需要注意的是,该注解只是一种提示,并不能完全消除空指针异常的发生。需要遵循良好的编码实践来确保程序的正确性和稳定性。