Java8 Lambda 和异常

标签 java lambda java-8

我想知道是否有人可以向我解释以下奇怪的现象。我正在使用 Java 8 更新 11。

鉴于此方法

private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
   return fun.apply(opt) ;
}

如果我首先构造一个函数对象,并将其传递给上面的方法,事情就会编译。

private void doesCompile() {
    Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
    runFun(fun, Optional.of("foo"));

}

但是,如果我将函数内联为 lambda,编译器会说

unreported exception X; must be caught or declared to be thrown

private void doesNotCompile () {
    runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}
<小时/>

更新: 结果错误信息被maven缩写了。如果直接用javac编译,错误为:

error: unreported exception X; must be caught or declared to be thrown
            runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
                                     ^
  where X,T are type-variables:
    X extends Throwable declared in method <X>orElseThrow(Supplier<? extends X>)
    T extends Object declared in class Optional

另请参阅here用于可运行的测试代码。

最佳答案

这就是为我解决问题的方法:

而不是写

optional.map(this::mappingFunction).orElseThrow(() -> new BadRequestException("bla bla"));

我写道:

optional.map(this::mappingFunction).<BadRequestException>orElseThrow(() -> new BadRequestException("bla bla"));

添加显式 <BadRequestException>有助于解决这些 lambda 边缘情况(这非常烦人......)

更新:这是为了防止您无法更新到最新的 JDK 版本,如果可以的话您应该...

关于Java8 Lambda 和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36350258/

相关文章:

java - Android 项目上的 WCF Web 服务 - 如何通过 Soap 对象获取 byte[] 类型?

java - OData Feed (olingo) 中缺少多对一关联

c# - C# 中的 lambda 表达式和消息框

java - (Java) 使用 Java8 将 JSONObject 的 JSONArray 展平为 [[]]

java - 只执行一个 SwingWorker 实例

java - 如何从个人我的商店检索证书

c++ - 为什么 C++ lambda 在多次调用时比普通函数慢?

visual-studio - 具有两个相同类型的自动参数的 MSVC lambda

Java:通过流将排序的映射键分配给数组

javafx - 我从 FXML 文件调用样式表 (css) 的语法有什么问题?