Java8 Lambdas and Exceptions
我想知道是否有人可以向我解释以下怪异之处。我使用的是 Java 8 update 11。
给定此方法
private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
return fun.apply(opt) ;
}
如果我首先构造一个函数 Object,并将其传递给上面的方法,那么事情就会编译。
private void doesCompile() {
Function<Optional<String>, 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 <X>orElseThrow(Supplier<? extends X>)
T extends Object declared in class Optional
有关可运行的测试代码,另请参阅此处。