Objects.requireNonNullElse()要求默认值非null,否则抛NPE;若首参非null则返回它,否则返回预设的非空默认值,适用于静态常量fallback场景。

Objects.requireNonNullElse() 是 Java 9 引入的工具方法,用于在对象为 null 时返回指定的默认值,同时**要求该默认值本身不能为 null**——如果传入的默认值是 null,会直接抛出 NullPointerException。
核心用法:提供一个非空默认对象
当你有一个可能为 null 的引用(比如从 Map 获取、方法返回、配置读取等),又想安全地 fallback 到一个确定不为空的静态值(如常量、字面量、已初始化的对象),就可以用它:
- 第一个参数是待检查的对象(可为
null) - 第二个参数是默认值(必须非空,否则立即抛异常)
- 返回值是:若第一个参数非
null,则返回它;否则返回第二个参数
典型场景示例
比如从配置中读取用户名,但配置缺失时希望用预设的“anonymous”:
String name = Objects.requireNonNullElse(config.getName(), "anonymous");
✅ 安全:即使 config.getName() 返回 null,结果也是字符串 "anonymous"(它本身非空)。
❌ 错误写法:Objects.requireNonNullElse(config.getName(), null) → 直接抛 NPE,不满足“提供默认值”的初衷。
和 Objects.requireNonNullElseGet() 的关键区别
如果你的默认值需要动态计算(比如调用方法、创建新对象),或者你希望延迟执行(避免无谓开销),应改用 requireNonNullElseGet(T, Supplier<? extends T>):
-
requireNonNullElse:默认值是**预先计算好、静态存在**的对象(如字符串字面量、常量、已实例化的对象) -
requireNonNullElseGet:默认值由Supplier懒加载,仅在需要时执行,适合开销大或有副作用的操作
注意事项
这个方法不是“兜底容错”,而是**明确契约:默认值必须可用**。它适合以下情况:
- 默认值是编译期确定的常量(
"N/A"、0、LocalDateTime.MIN等) - 你已确保默认参数在调用前就非
null(例如来自static final字段) - 你不需要处理默认值也为
null的复杂 fallback 逻辑(那种情况建议手动 if-else 或 Optional)

















