我正在使用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。
Incompatible thrown types *SomeException* in method reference
IDEA也给了我错误unhandled exception。
unhandled exception
所以,我的问题是为什么?为什么代码在每个循环中都用编译,而lambda不编译?
如果您查看Consumer<T>接口,则该accept方法(您的方法引用将有效使用的方法)未声明为抛出任何已检查的异常- 因此,您无法使用 已 声明为抛出一个已检查的异常的方法引用。增强的for循环还可以,因为您始终处在SomeException可以抛出的上下文中。
Consumer<T>
accept
SomeException
您可能创建一个包装程序,将检查后的异常转换为未检查后的异常,并抛出该包装。或者,您可以使用 确实 引发已检查异常的accept()方法声明您自己的功能接口(可能对该异常进行参数化),然后编写将该功能接口作为输入的自己的方法。 __forEach
accept()
forEach