Java8 Lambdas e exceções
Gostaria de saber se alguém poderia me explicar a seguinte estranheza. Estou usando o Java 8, atualização 11.
Dado este método
private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
return fun.apply(opt) ;
}
Se eu construir uma função Object pela primeira vez e passar isso para o método acima, as coisas serão compiladas.
private void doesCompile() {
Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
runFun(fun, Optional.of("foo"));
}
Mas, se eu embutir a função como uma lambda, o compilador diz
exceção não declarada X; deve ser capturado ou declarado lançado
private void doesNotCompile () {
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}
Atualizar: Acontece que a mensagem de erro foi abreviada por maven. Se compilado diretamente com o javac, o erro é:
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
Veja tambémaqui para código de teste executável.