我陷入了一个错误:
java.util.concurrent.CompletionException:java.lang.NullPointerException:无法调用“java.util.concurrent.CompletionStage.toCompletableFuture()”,因为“java.util.function.Function.apply(Object)”的返回值为空
错误所指向的行如下所示:
.handle(
(result, ex) -> {
if (ex == null) {
return null;
} else if (ex.getCause() instanceof NotFoundException) {
return configStore.doSomething(); /** returns a CompletionStage<Void> **/
}
throw new CompletionException(ex.getCause());
})
.thenCompose(x -> x); /** error points here **/
我认为
.thenCompose(x -> x);
是必要的,因为 .handle(...)
不会解开 CompletionStage<...>
,导致在 CompletionStage<CompletionStage<...>>
内链接时产生 .handle(...)
。
为了解决该错误,我还尝试返回此而不是
null
...
.handle(
(result, ex) -> {
if (ex == null) {
return CompletableFuture.completedFuture(null); /** tried this **/
} else if ...
...但随后我收到此错误(更多上下文的屏幕截图):
写题的时候就想通了;自我回答,因为我的 Google 和 SO 搜索以及错误消息并没有指向我这个解决方案。
该解决方案实际上是由 IntelliJ 建议的(屏幕截图中的蓝色文本),但我没有看到它。因为
null
的类型不明确,所以您必须像这样转换表达式:
.handle(
(result, ex) -> {
if (ex == null) {
return CompletableFuture.<Void>completedFuture(null); /** cast to <Void> **/
} else if ...