一尘不染

Java 8方法参考未处理的异常

java

我正在使用Java 8进行项目开发,发现了一种我无法理解的情况。

我有这样的代码:

void deleteEntity(Node node) throws SomeException {
    for (ChildNode child: node.getChildren()) {
       deleteChild(child);
    }
}

void deleteChild(Object child) throws SomeException {
    //some code
}

这段代码可以正常工作,但是我可以使用方法参考将其重写:

void deleteEntity(Node node) throws SomeException {
    node.getChildren().forEach(this::deleteChild);
}

而且此代码无法编译,从而导致错误Incompatible thrown types *SomeException* in method reference

IDEA也给了我错误unhandled exception

所以,我的问题是为什么?为什么代码在每个循环中都用编译,而lambda不编译?


阅读 262

收藏
2020-09-08

共1个答案

一尘不染

如果您查看Consumer<T>接口,则该accept方法(您的方法引用将有效使用的方法)未声明为抛出任何已检查的异常-
因此,您无法使用 声明为抛出一个已检查的异常的方法引用。增强的for循环还可以,因为您始终处在SomeException可以抛出的上下文中。

您可能创建一个包装程序,将检查后的异常转换为未检查后的异常,并抛出该包装。或者,您可以使用 确实
引发已检查异常的accept()方法声明您自己的功能接口(可能对该异常进行参数化),然后编写将该功能接口作为输入的自己的方法。 __forEach

2020-09-08