java - 从 lambda 表达式中抛出的已检查异常

标签 java exception-handling lambda java-8 checked-exceptions

您能否解释一下为什么必须从 lambda 表达式中捕获已检查的异常?换句话说,为什么下面的代码不能编译...

public void doSomething(ObjectInputStream istream) throws IOException {
  // The read method throws an IOException.
  IntStream.range(0, 10).forEach(i -> someList.add(read(istream)));
}

但是这个会吗?

public void doSomething(ObjectInputStream istream) throws IOException {
  IntStream.range(0, 10).forEach(i -> {
    try {
      // The read method throws an IOException.
      someList.add(read(istream));
    }
    catch (IOException ioe) {
      // Callee has to handle checked exception, not caller.
    }
  });
}

似乎被调用者现在必须处理抛出的所有已检查异常,而不是调用者。

最佳答案

问题不在于 lambda 表达式,而在于它所实现的接口(interface)。请记住,lambda 表达式基本上只是实现给定接口(interface)的匿名类的简写。

在这种情况下,forEach需要 java.util.function.Consumer<T> :

public interface Consumer<T> {
    void accept(T t);
    ...
}

请注意 accept没有声明要扔任何东西。这意味着它的任何实现都不能抛出任何东西;不是命名类,不是匿名类,也不是 lambda。

关于java - 从 lambda 表达式中抛出的已检查异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28707435/

相关文章:

java - 是否有任何简单的 JNDI 上下文实现,这意味着它们可以启动/停止等而不会泄漏

java - List forEach 附方法引用说明

java - 将 XMLGregorianCalendar 转换为 MM/dd/yyyy hh :mm String? 的最佳方法是什么

Python 忽略异常并回到原来的位置

c# - Windows 窗体 ComboBox 导致间歇性 System.AccessViolationException

java - 如果线程启动 Executor,则无法从 Future<?> 和 SwingWorker 获取 ArrayIndexOutOfBoundsException

java - 在 Java 8 中的 Map<String, List> 中向 List 添加值

C# Expression 基于 AST 同时使用 And Or 和 Not 表达式

java - 如何将 Spring Boot 应用程序项目部署到 Heroku

java - 从 ubuntu 终端执行 Junit 时出错