静态提示
@NonNull 是 Spring Framework 提供的一个注解,用于指示某个元素(如字段、方法返回值或参数)不能为 null。它通常用于提高代码的可读性和可维护性,并帮助工具(如静态分析器)检测潜在的 null 引用问题。
以下是一些常见的使用场景:
1. 方法参数
import org.springframework.lang.NonNull;
public void setName(@NonNull String name) {
this.name = name;
}
在这个例子中,name 参数不能为 null。
2. 方法返回值
import org.springframework.lang.NonNull;
@NonNull
public String getName() {
return this.name;
}
在这个例子中,getName 方法不能返回 null。
3. 字段
import org.springframework.lang.NonNull;
public class User {
@NonNull
private String name;
// getters and setters
}
在这个例子中,name 字段不能为 null。
4. 局部变量
虽然不常见,但你也可以在局部变量上使用 @NonNull 注解:
import org.springframework.lang.NonNull;
public void process() {
@NonNull String name = getName();
// do something with name
}
使用注意事项
- 工具支持:确保你的开发环境和构建工具支持
@NonNull注解。Spring Framework 提供了org.springframework.lang.NonNull注解。 - 静态分析:使用静态分析工具(如 IntelliJ IDEA 的内置检查、FindBugs 或 SpotBugs)来检测潜在的
null引用问题。
示例代码
以下是一个完整的示例,展示了如何在类中使用 @NonNull 注解:
import org.springframework.lang.NonNull;
public class User {
@NonNull
private String name;
@NonNull
public String getName() {
return name;
}
public void setName(@NonNull String name) {
this.name = name;
}
public static void main(String[] args) {
User user = new User();
user.setName("John Doe");
System.out.println("User name: " + user.getName());
}
}
在这个示例中,User 类的 name 字段、getName 方法和 setName 方法的参数都不能为 null。如果尝试将 null 赋值给 name 字段或传递给 setName 方法,编译器或静态分析工具将会发出警告或错误。
抛异常提示
如果希望在传入 null 时抛出异常,可以使用 @NonNull 注解,并在方法中显式地进行 null 检查。Spring Framework 的 @NonNull 注解本身不会自动抛出异常,但你可以结合 Objects.requireNonNull 方法来实现这一点。
示例代码
以下是一个完整的示例,展示了如何在方法中使用 @NonNull 注解,并在传入 null 时抛出异常:
import org.springframework.lang.NonNull;
import java.util.Objects;
public class User {
@NonNull
private String name;
@NonNull
public String getName() {
return name;
}
public void setName(@NonNull String name) {
this.name = Objects.requireNonNull(name, "Name cannot be null");
}
public static void main(String[] args) {
User user = new User();
try {
user.setName(null);
} catch (NullPointerException e) {
System.out.println(e.getMessage()); // 输出: Name cannot be null
}
}
}
在这个示例中:
@NonNull注解用于指示name字段和setName方法的参数不能为null。- 在
setName方法中,使用Objects.requireNonNull方法进行null检查。如果传入null,将抛出NullPointerException并显示指定的错误消息。
其他注解库
如果你使用其他注解库(如 Lombok),可以使用 Lombok 提供的 @NonNull 注解,它会自动生成 null 检查代码。
Lombok 示例代码
以下是使用 Lombok 的示例:
import lombok.NonNull;
public class User {
@NonNull
private String name;
@NonNull
public String getName() {
return name;
}
public void setName(@NonNull String name) {
this.name = name;
}
public static void main(String[] args) {
User user = new User();
try {
user.setName(null);
} catch (NullPointerException e) {
System.out.println(e.getMessage()); // 输出: name is marked non-null but is null
}
}
}
在这个示例中,Lombok 的 @NonNull 注解会自动生成 null 检查代码,并在传入 null 时抛出 NullPointerException。



















