java 8 引入的 optional 类通过封装可能为空的值,从根源上消除了对 null 的检查。处理空指针异常的核心做法是:使用静态方法 ofnullable() 创建容器,利用 orelse() 或 orelseget() 提供默认值,并通过 map() 和 flatmap() 安全地执行链式操作。

如何安全获取值并设置默认回退
当需要提取 Optional 中的值时,直接调用 get() 在值为空时会抛出 NoSuchElementException,这依然会导致程序崩溃。正确的做法是使用 orElse() 或 orElseGet() 来指定一个备用值。如果备选值是预先计算好的常量或对象,使用 orElse();如果备选值的生成代价较高(如查询数据库),则应使用 orElseGet() 传入 Supplier 函数式接口,以确保仅在原值为空时才执行该逻辑。

import java.util.Optional;
public class OptionalDemo {
public static void main(String[] args) {
// 模拟可能为 null 的来源
String source = null;
// 1. 创建 Optional 实例
Optional<string> opt = Optional.ofNullable(source);
// 2. 使用 orElse 获取值,若为空则返回 "Default"
String value1 = opt.orElse("Default");
System.out.println("Value 1: " + value1); // 输出: Value 1: Default
// 3. 使用 orElseGet 获取值,若为空则执行 lambda
String value2 = opt.orElseGet(() -> generateExpensiveValue());
System.out.println("Value 2: " + value2); // 输出: Value 2: Generated
}
private static String generateExpensiveValue() {
return "Generated";
}
}</string>
如何避免链式调用中的空指针
在处理嵌套对象或复杂转换时,传统的 getter 链式调用极易引发空指针。例如 a.getB().getC(),如果 b 为 null,后续调用将失败。使用 Optional 的 map() 方法可以将这种链式调用转化为安全的流式处理。map() 接收一个 Function,仅当 Optional 包含非空值时才会执行该函数,并将结果包装在新的 Optional 中;如果中间步骤返回 null,map() 会自动将其转换为空的 Optional,从而阻断异常传播。

import java.util.Optional;
class User {
private Address address;
public Address getAddress() { return address; }
}
class Address {
private String city;
public String getCity() { return city; }
}
public class SafeChaining {
public static void main(String[] args) {
User user = new User();
user.setAddress(null); // 模拟地址为空
// 传统方式会抛 NPE: String city = user.getAddress().getCity();
// 安全方式
String city = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("Unknown City");
System.out.println("City: " + city); // 输出: City: Unknown City
}
}
基于 Optional 过滤无效数据的具体问题
在实际业务中,经常需要根据条件过滤掉无效数据。使用 filter() 方法可以优雅地实现这一需求。如果 Optional 中包含的值不满足给定的 Predicate 条件,filter() 会返回一个空的 Optional,而不是抛出异常或保留错误值。这使得在 Stream 流处理或单步逻辑判断中,能够以声明式的方式剔除不符合预期的输入,保持代码的健壮性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











