@NotNull 注解
时间: 2025-07-23 11:01:04 浏览: 8
`@NotNull` 是一个常见的注解,用于在编程中标记某个参数、方法返回值或字段不能为 `null`。它通常用于静态代码分析工具或框架中,帮助开发者在编译时或运行时捕获潜在的空指针异常,从而提高代码的健壮性和可维护性。
### 主要用途
1. **参数校验**:标记方法的参数不能为 `null`,如果传入 `null`,可能会抛出异常(如 `IllegalArgumentException`)。
2. **返回值校验**:标记方法的返回值不能为 `null`,调用者可以放心使用返回值而无需额外判空。
3. **字段校验**:标记类的字段不能为 `null`,通常在对象构造或序列化时进行校验。
### 常见实现
- **JSR-305**:`javax.annotation.Nonnull`(Java 标准注解,但已停止维护)。
- **JSR-380(Bean Validation)**:`javax.validation.constraints.NotNull`(常用于 Java EE/Spring 的校验框架)。
- **Lombok**:`@NonNull`(通过 Lombok 注解生成判空代码)。
- **IntelliJ IDEA/Android**:`org.jetbrains.annotations.NotNull`(IntelliJ 系列 IDE 内置注解)。
- **Checker Framework**:`org.checkerframework.checker.nullness.qual.NonNull`(静态类型检查工具)。
### 示例代码
#### 1. 标记方法参数不能为 `null`
```java
import javax.annotation.Nonnull;
public class Example {
public void process(@Nonnull String input) {
// 如果 input 为 null,可能在运行时抛出异常(取决于具体实现)
System.out.println("Processing: " + input.toUpperCase());
}
}
```
#### 2. 标记返回值不能为 `null`
```java
import javax.annotation.Nonnull;
public class Example {
@Nonnull
public String getData() {
// 必须返回非 null 值,否则可能违反注解约束
return "Hello, World!";
}
}
```
#### 3. 结合 Lombok 使用
```java
import lombok.NonNull;
public class Example {
public void process(@NonNull String input) {
// Lombok 会在编译时生成判空代码,如果 input 为 null 会抛出 NullPointerException
System.out.println("Processing: " + input.toUpperCase());
}
}
```
#### 4. 结合 Spring Validation 使用
```java
import javax.validation.constraints.NotNull;
public class User {
@NotNull(message = "用户名不能为空")
private String username;
// getter 和 setter
}
```
### 注意事项
1. **注解不强制生效**:`@NotNull` 本身不会自动阻止 `null` 的传入或返回,需要配合静态分析工具(如 IntelliJ IDEA、SpotBugs)或运行时校验框架(如 Hibernate Validator)才能发挥效果。
2. **不同实现的差异**:不同库的 `@NotNull` 注解可能行为不同,需根据项目依赖选择合适的注解。
3. **与 `@Nullable` 配合**:通常与 `@Nullable` 注解一起使用,明确标记哪些值允许为 `null`。
阅读全文
相关推荐


















