当前位置: 首页 > 面试题库 >

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

郜振国
2023-03-14
问题内容

我正在使用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不编译?


问题答案:

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

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



 类似资料:
  • 我正在和Java8一起做项目,发现了一个我无法理解的情况。 我有这样的代码: 这段代码运行良好,但我可以使用方法引用重写它: 而这段代码没有编译,在方法引用中给出了不兼容的抛出类型*SomeException*。 IDEA还向我提供了错误

  • 1 Python 异常处理参考 本节简单罗列 Python 语言中与异常处理有关的常用语句形式及用法。 发生错误时通常由系统自动抛出异常,但也可由程序自己抛出并捕获。 捕获并处理异常:try-except 发生错误时,如果应用程序没有预定义的处理代码,则由 Python 的缺省异常处理机制 来处理,处理动作是中止应用程序并显示错误信息。如果程序自己处理异常,可编写 try-except 语句来定义

  • 我阅读了关于Lambda表达式的Java 8教程,但不太了解“引用特定类型的任意对象的实例方法”的方法引用示例 在同一教程中,有一个示例“引用特定对象的实例方法”,看起来像。 我可以看到这个工作,因为方法compareByName与Comparator.comparelambda(a, b)具有相同的签名- 现在“引用特定类型的任意对象的实例方法”示例使用String::compareToIgno

  • 问题内容: 我正在开发一个Android应用,该应用必须将json格式的Java对象保存到SQLite数据库中。我为此操作编写了代码,然后他们必须提取Json对象并将其重新转换为Java对象。当我尝试调用将json对象反序列化为字符串的方法时,我在Android Studio中发现此错误: 当我尝试捕获程序运行但不反序列化json对象时。 这是该方法的代码: 你能帮我吗? 问题答案: 是的,您需要

  • 我主要是为技术精明的人编写一个小工具,例如程序员、工程师等,因为这些工具通常是快速的,随着时间的推移,我知道会有未处理的异常,用户不会介意。我希望用户能够向我发送回溯,这样我就可以检查发生了什么,并可能改进应用程序。 我通常做wxPython编程,但我最近做了一些Java。我已经将

  • 问题内容: Java8中是否有一种方法可以将方法引用用作对象来使用其方法,例如: 这个问题与无关,仅作为示例,我想对方法参考有答案 问题答案: 您可以编写一个静态方法来执行此操作: 然后,您可以将其放在实用程序类中并静态导入。 或者,创建一个更简单的静态方法,该方法 只 返回给定的函数,以使编译器知道您在做什么: