Java基本类型不能为null,其包装类可为null,直接拆箱易抛NullPointerException;应先判空或用Objects.requireNonNullElse、Optional等安全处理。

Java 中基本类型(如 int、boolean)本身不能为 null,但其对应的包装类(如 Integer、Boolean)可以为 null。赋值时若不注意,容易在自动拆箱时触发 NullPointerException。关键在于:**避免对可能为 null 的包装类直接拆箱,优先使用安全的转换方式或明确处理空值**。
用基本类型变量时,别直接接收可能为 null 的包装类
下面这种写法非常危险:
Integer x = null; int y = x; // 运行时报 NullPointerException!
因为 JVM 会自动调用 x.intValue(),而 null.intValue() 抛异常。
- ✅ 安全做法:先判空,再赋值
Integer x = null; int y = (x != null) ? x : 0; // 或用 Objects.requireNonNullElse(x, 0)
- ✅ 更推荐:用
Objects.requireNonNullElse(JDK 9+)或Optional封装逻辑
int y = Objects.requireNonNullElse(x, 0); // JDK 9+
int y = Optional.ofNullable(x).orElse(0); // 兼容老版本,语义清晰
从字符串或外部输入解析数值时,优先用 valueOf + try-catch 或工具类
像 Integer.parseInt("abc") 会抛 NumberFormatException,而 Integer.valueOf("abc") 同样抛异常——它们都不返回 null。
立即学习“Java免费学习笔记(深入)”;
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- ❌ 不要依赖
valueOf来“安全”处理非法字符串(它不会返回 null) - ✅ 推荐封装一个安全解析方法:
public static Integer safeParseInt(String s) {
if (s == null || s.trim().isEmpty()) return null;
try {
return Integer.valueOf(s.trim());
} catch (NumberFormatException e) {
return null;
}
}
这样后续可配合 Optional 或判空使用,避免拆箱风险。
集合和泛型中必须用包装类,取值时务必防 null
比如 List<integer></integer>、Map<string boolean></string>,里面元素天然可能是 null。
- ❌ 错误示例:
List<Integer> list = Arrays.asList(1, null, 3); int sum = list.stream().mapToInt(i -> i).sum(); // 遇到 null 时崩溃
- ✅ 正确做法:过滤 null 或替换默认值
int sum = list.stream()
.filter(Objects::nonNull)
.mapToInt(Integer::intValue)
.sum();
int sum = list.stream()
.mapToInt(i -> i != null ? i : 0)
.sum();
构造对象或设属性时,用包装类字段 + 明确的空值策略
例如 DTO 或实体类中定义 private Integer age;,接收 JSON 或表单时可能为 null。
- ✅ 建议:在 getter 或业务逻辑中统一处理空值,而不是任由
null流入计算上下文 - ✅ 使用 Lombok 的
@Builder.Default或构造器预设默认值(适用于“空即无效”的场景) - ✅ Spring Boot 中可用
@NotNull+@Valid提前拦截,或自定义Converter将空字符串转为null或默认值
例如:
public class User {
private Integer age;
public int getAgeOrDefault(int defaultValue) {
return age != null ? age : defaultValue;
}
}
不复杂但容易忽略:null 不是语法错误,而是运行时陷阱;只要涉及包装类参与算术、比较、条件判断,就该默认假设它可能为空,并主动防御。

















