无法调用 toCompletableFuture(),因为在使用返回 CompletionStage 的方法时 apply(Object) 的返回值为 null<Void>

问题描述 投票:0回答:1

我陷入了一个错误:

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 ...

...但随后我收到此错误(更多上下文的屏幕截图):

java nullpointerexception completable-future
1个回答
0
投票

写题的时候就想通了;自我回答,因为我的 Google 和 SO 搜索以及错误消息并没有指向我这个解决方案。

该解决方案实际上是由 IntelliJ 建议的(屏幕截图中的蓝色文本),但我没有看到它。因为

null
的类型不明确,所以您必须像这样转换表达式:

.handle(
    (result, ex) -> {
      if (ex == null) {
        return CompletableFuture.<Void>completedFuture(null); /** cast to <Void> **/
      } else if ...
© www.soinside.com 2019 - 2024. All rights reserved.