Java8 Lambdas and Exceptions
This is what solved the problem for me:
instead of writing
optional.map(this::mappingFunction).orElseThrow(() -> new BadRequestException("bla bla"));
I wrote:
optional.map(this::mappingFunction).<BadRequestException>orElseThrow(() -> new BadRequestException("bla bla"));
Adding the explicit <BadRequestException>
helps with these lambda edge cases (which are quite annoying...)
UPDATE: This is in case you can't update to the latest JDK version, if you can you should...
This looks like a case of bug JDK-8054569, which doesn't affect Eclipse.
I was able to narrow it down by replacing Function with Supplier and extracting the orElseThrow
method:
abstract <T> void f(Supplier<T> s);
abstract <T, X extends Throwable> T g(Supplier<? extends X> x) throws X;
void bug() {
f(() -> g(() -> new RuntimeException("foo")));
}
and then further by removing the suppliers and lambdas altogether:
abstract <T> void f(T t);
abstract <T, X extends Throwable> T g(X x) throws X;
void bug() {
f(g(new RuntimeException("foo")));
}
which is actually a cleaner example than the one in the bug report. This shows the same error if compiled as Java 8, but works fine with -source 1.7
.
I guess something about passing a generic method return type to a generic method parameter causes the type inference for the exception to fail, so it assumes the type is Throwable and complains that this checked exception type isn't handled. The error disappears if you declare bug() throws Throwable
or change the bound to X extends RuntimeException
(so it's unchecked).