Lambda 表达式中可以使用几种方式处理异常:
- 让异常越过 Lambda 表达式边界,由外层代码处理。
例如:
Consumer<Integer> consumer = (x) -> doSomething(x);
try {
consumer.accept(100);
} catch (Exception e) {
// 处理异常
}
这里的异常会直接被外层的 try/catch 块捕获。
- 在 Lambda 表达式中使用 try/catch 块处理异常。
例如:
Consumer<Integer> consumer = (x) -> {
try {
doSomething(x);
} catch (Exception e) {
// 处理异常
}
};
使用 try/catch 块直接在 Lambda 表达式内部处理异常。
- 在函数式接口的抽象方法中声明受检查异常,并在 Lambda 表达式中显式抛出。
例如:
@FunctionalInterface
public interface Consumer {
void accept(Integer x) throws Exception;
}
Consumer<Integer> consumer = (x) -> {
doSomething(x);
throw new Exception();
};
这里 Consumer 接口的 accept() 方法声明受检查异常 Exception,所以 Lambda 表达式实现需要显式抛出该异常。
- 使用 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 块捕获。