java安全判空需分层处理:单层用==null或objects.nonnull;字符串须兼顾null、空串与空白,推荐str==null||str.isblank();嵌套访问宜用optional链式操作;外部返回值默认按可能为null处理。

Java 中对象属性为 null 是常见但高危的情况,直接调用其方法或访问嵌套字段极易触发 NullPointerException。安全判空不是“加个 if”,而是要结合语义、层级和使用场景选择合适方式。
基础判空:优先用 == null 或 Objects.nonNull
对单层引用属性(如 user.getName()),最直接安全的方式是显式比较:
- 用
if (obj == null)或if (Objects.nonNull(obj))—— 简洁、无副作用、JVM 优化友好 - 避免
obj.equals(...)或obj.toString()前不检查,哪怕只有一行也必须前置判断 - 构造器和 setter 中可配合
Objects.requireNonNull(name, "name must not be null")主动拦截非法输入
字符串属性:别只判 null,还要处理空白
字符串常出现 null、""、"\t \n" 等多种“空”形态,单独用 == null 不够:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Java 8+ 推荐统一用
str == null || str.isBlank(),它天然兼容 null、空串、全空白字符 - 若需转 null(如清洗 DTO 字段),应明确业务意图:
if (str == null || str.isBlank()) str = null; - 禁止写
str.trim().equals("")——trim()在 str 为 null 时会 NPE;也不推荐"".equals(str),虽安全但漏掉空白字符
嵌套属性访问:避免链式调用崩塌
像 user.getAddress().getCity().toUpperCase() 这类写法,任一环节为 null 都会崩溃:
- 逐层判空:先
if (user != null && user.getAddress() != null && user.getAddress().getCity() != null) - 更清晰的替代是
Optional链式操作:Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .map(String::toUpperCase) .orElse("N/A") - 注意:Optional 适合返回值封装,不要用作字段类型或方法参数,否则增加序列化和调试负担
工具类与设计层面的加固
判空不止是语法问题,更是代码健壮性的体现:
- 对外部方法返回值(如 DAO 查询、HTTP 调用)默认按可能为 null 处理,不要信任文档或“应该不为空”
- 集合元素取值前务必确认集合非 null,再确认索引合法,再确认元素非 null:
if (list != null && !list.isEmpty() && list.get(0) != null) - 考虑空对象模式(Null Object Pattern):为关键接口提供无行为的默认实现,让调用方无需判空即可安全调用
- 用 Lombok 的
@Setter(onMethod_ = @NonNull)或 Spring 的@NotNull注解配合校验框架,在运行时/编译期提前暴露问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










