gpt4 book ai didi

java - 为什么在提供 lambda 参数时必须捕获异常?

转载 作者:行者123 更新时间:2023-12-02 19:11:00 26 4
gpt4 key购买 nike

考虑以下示例:

public class LambdaArgsTest {
private static void display(Supplier<?> arg) {
try {
// this is the place where the Exception("wrong") might be thrown
// and it is in fact handled
System.out.println(arg.get());
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
display(() -> {
if(/*some condition*/) {
// this statement will be rejected due to unhandled exception
throw new Exception("wrong");
}
return "abcde";
});
}
}

问题来了:上例中的 lambda 参数是一个对象,稍后将在“display()”方法中执行。当将参数传递给“display()”时,它显然没有被执行。

为什么会被编译器拒绝?我认为只有在实际调用 lambda 时才用 try...catch 包围它是相当合理的。

最佳答案

这是因为Supplier功能接口(interface)的签名:

T get();

如您所见,方法 get 未声明为抛出 Exception(也没有任何其他检查异常)。

在 Java 中,存在检查未检查异常(未检查异常是从RuntimeException继承的异常)。必须处理已检查的异常,方法是在 catch block 中捕获它们,或者声明该方法抛出该异常。

如果Supplier.get的签名是:

T get() throws Exception:

代码可以正常编译。

尝试抛出RuntimeException而不是Exception,代码将可以正常编译。


编辑:根据 Peter Lawrey 在评论中的建议,如果您确实需要从 lambda 表达式中抛出已检查的异常,您可以使用例如Callable ,其唯一的一个方法的签名如下:

T call() throws Exception;

您只需将 Callable 传递给您的 display 方法,而不是 Supplier

关于java - 为什么在提供 lambda 参数时必须捕获异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64282400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com