Java8 Lambdas and Exceptions

21 浏览
0 Comments

Java8 Lambdas and Exceptions

我想知道是否有人能解释一下下面的奇怪现象。我正在使用Java 8更新11版本。

给定以下方法:

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

如果我首先构造一个函数对象,并将其传递给上述方法,就可以编译通过。

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

但是,如果我将函数内联为lambda表达式,编译器会报错:

未报告的异常X;必须捕获或声明为抛出

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 orElseThrow(Supplier)
    T extends Object declared in class Optional

另请参阅此处可运行的测试代码。

0