Objects.requireNonNullElse()专用于非空断言+默认值回退,仅判断引用是否为null,不处理空字符串或空集合等语义空;defaultValue可为null,但易致NPE;需配合StringUtils.isBlank()等做业务层校验。

Objects.requireNonNullElse() 的核心用途和适用场景
这个方法不是用来“兜底空值”的通用工具,而是专为“非空断言 + 默认值 fallback”设计的。它会在第一个参数为 null 时返回第二个参数,但一旦第一个参数非 null,就直接返回它——不做任何类型检查或转换。
常见误用是把它当 Optional.orElse() 或三元表达式替代品,结果在传入非 null 但逻辑上“无效”的对象(比如空集合、空字符串)时毫无反应。
和 Objects.requireNonNull()、Objects.nonNull() 的关键区别
Objects.requireNonNullElse() 不抛异常,也不返回布尔值,它只做一件事:选一个非 null 的引用返回。
-
Objects.requireNonNull(obj):obj为null就抛NullPointerException -
Objects.nonNull(obj):只返回true/false,不参与值流 -
Objects.requireNonNullElse(obj, defaultValue):返回obj(若非null),否则返回defaultValue
注意:defaultValue 本身可以为 null,但此时如果 obj 也是 null,最终结果就是 null——这通常不是你想要的。
典型错误与安全写法
常见错误现象:
- 把空字符串
""当作“需要 fallback”的情况,但requireNonNullElse(str, "default")对""完全无感,因为"" != null - 传入
defaultValue为null,导致链式调用后续 NPE - 在泛型上下文中忽略类型擦除,误以为能自动转型
安全写法要点:
- 明确区分
null和“空但非null”语义(如String、Collection),必要时组合使用StringUtils.isBlank()或Collection.isEmpty() - 总是确保
defaultValue是非null实例,例如用new ArrayList<>()而非null - 若需深度校验(如对象字段是否为空),不要依赖此方法,改用显式判空逻辑
示例:
String name = Objects.requireNonNullElse(user.getName(), "anonymous"); // ✅ 安全:user.getName() == null → 返回 "anonymous" // ❌ 但 user.getName() == "" → 仍返回 ""
性能与兼容性注意事项
- 从 Java 9 引入,低于该版本不可用,编译期会报错
cannot resolve method requireNonNullElse
- 方法体极轻量,等价于
obj != null ? obj : defaultObj,无反射、无同步、无装箱开销
- 泛型擦除下,返回类型完全由调用处类型推导决定,不支持强制转型;如下写法会编译失败:
Number n = Objects.requireNonNullElse(obj, 42); // OK,42 是 Integer
String s = Objects.requireNonNullElse(obj, "hi"); // OK
List<String> list = Objects.requireNonNullElse(obj, null); // ❌ 编译警告 + 潜在 NPE
cannot resolve method requireNonNullElse
obj != null ? obj : defaultObj,无反射、无同步、无装箱开销Number n = Objects.requireNonNullElse(obj, 42); // OK,42 是 Integer String s = Objects.requireNonNullElse(obj, "hi"); // OK List<String> list = Objects.requireNonNullElse(obj, null); // ❌ 编译警告 + 潜在 NPE
真正容易被忽略的是:它只解决引用是否为 null 这一层问题,而业务中绝大多数“空”其实是语义空。别让它替你做本该由领域逻辑判断的事。

















