Java8 Lambdas y Excepciones
Me pregunto si alguien podría explicarme la siguiente rareza. Estoy usando la actualización 11 de Java 8.
Dado este método
private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
return fun.apply(opt) ;
}
Si primero construyo una función Object, y la paso al método anterior, las cosas se compilan.
private void doesCompile() {
Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
runFun(fun, Optional.of("foo"));
}
Pero, si alineo la función como lambda, el compilador dice
excepción no declarada X; debe ser atrapado o declarado ser arrojado
private void doesNotCompile () {
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}
Actualizar: Resulta que el mensaje de error fue abreviado por maven. Si se compila directamente con javac, el error es:
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
Ver tambiénaquí para código de prueba ejecutable.