Java8 Lambdas and Exceptions
Java8 Lambdas and Exceptions
我想知道是否有人能解释一下下面的奇怪现象。我正在使用Java 8更新11版本。
给定以下方法:
privateT 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 methodorElseThrow(Supplier extends X>) T extends Object declared in class Optional
另请参阅此处可运行的测试代码。