Java 8方法引用未处理的异常

我正在使用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);
}

并且这个代码不编译,给出错误不匹配的抛出类型* SomeException *在方法引用。

IDEA也给了错误未处理的异常。

所以,我的问题是为什么?为什么代码编译与每个循环和不编译lambda?

如果你看看Consumer<T>接口,accept方法(这是你的方法引用将有效地使用)不声明抛出任何检查异常 – 因此你不能使用被声明抛出一个被检查的异常的方法引用。增强的for循环是好的,因为你总是在一个上下文中SomeException可以抛出。

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

http://stackoverflow.com/questions/25643348/java-8-method-reference-unhandled-exception

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Java 8方法引用未处理的异常