【问题标题】:What's idiom/best practice with UncheckedIOException and Stream API?UncheckedIOException 和 Stream API 的习惯用法/最佳实践是什么?
【发布时间】:2014-05-01 04:13:57
【问题描述】:

Java 8 正式将java.io.UncheckedIOException 引入 JDK 类库,用于带有 Stream API 的 lambda,因为 lambda 表达式无法声明其 throws-clause 并且 lambda 主体无法抛出 IOException 等已检查异常。

UncheckedIOException 和 Stream API 的习惯用法/最佳实践是什么?我在什么条件下显式抛出新的UncheckedIOException 对象,何时应该捕获UncheckedIOException 异常?

【问题讨论】:

  • 次要点 - lambdas 当然可以抛出IOExceptions,但前提是它们所代表的接口方法也这样做。
  • @aepurniet 谢谢你的观点,我隐含地假定没有 throws 子句的功能接口,例如 java.util.function.Consumer<T> for Stream#forEach()...

标签: java lambda java-8


【解决方案1】:

您将在与当前执行此操作的库方法(BufferedReader.linesFiles.lines)相同的情况下抛出它:也就是说,当您包装由打开文件后的操作导致的 I/O 异常时(文件打开操作仍然抛出 IOException)。至于捕获它,这取决于您的 IO 错误恢复策略:换句话说,您可以在非流代码中处理包装的 IOException。

【讨论】:

  • IMO,不管 IO 错误恢复的策略如何,在 Stream API 调用方法中捕获/解包 UncheckedIOException 并重新抛出作为检查异常(IOException)似乎是合理的。您如何看待这一点?
  • @yohjp 是的,从流代码中捕获/解包未经检查的异常,然后重新抛出IOException,如果那是您的方法无论如何都会做的,否则处理IOException,如果那是什么你的方法可以。 PS。答案是否被接受?