如何使用Lambda表达式处理异常?代码举例讲解

Lambda 表达式中可以使用几种方式处理异常:

  1. 让异常越过 Lambda 表达式边界,由外层代码处理。
    例如:
Consumer<Integer> consumer = (x) -> doSomething(x);
try {
    consumer.accept(100);  
} catch (Exception e) {
    // 处理异常
}

这里的异常会直接被外层的 try/catch 块捕获。

  1. 在 Lambda 表达式中使用 try/catch 块处理异常。
    例如:
Consumer<Integer> consumer = (x) -> { 
    try {
        doSomething(x);
    } catch (Exception e) {
        // 处理异常
    }
};

使用 try/catch 块直接在 Lambda 表达式内部处理异常。

  1. 在函数式接口的抽象方法中声明受检查异常,并在 Lambda 表达式中显式抛出。
    例如:
@FunctionalInterface
public interface Consumer {
    void accept(Integer x) throws Exception; 
}

Consumer<Integer> consumer = (x) -> {
    doSomething(x);
    throw new Exception(); 
};

这里 Consumer 接口的 accept() 方法声明受检查异常 Exception,所以 Lambda 表达式实现需要显式抛出该异常。

  1. 使用 Supplier< exceptionalConsumer > 包装异常 Lamba 表达式。
    例如:
Supplier<Consumer<Integer>> supplier = () -> {
    return (x) -> { 
        doSomething(x);
        throw new Exception();
    };  
}; 
Consumer<Integer> consumer = supplier.get();
try {
    consumer.accept(100);
} catch (Exception e) {
    // 处理异常
}  

这里使用 Supplier 将 Lambda 表达式包装起来,异常会被外层的 try/catch 块捕获。