如何在可完成的未来识别空指针异常?
How do I identify the null pointer exception in completable future?
我有一个可抛出 NPE 的可完成的未来代码。我无法在本地重现异常。
我已尝试对代码进行验收测试和单元测试,但没有给出准确的错误响应。
final List<CompletableFuture<Map<K, V>>> completableFutures =
copy.stream()
.map(copy -> getRespForId(requestContext, copy))
.collect(Collectors.toList());
return CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture<?>[0]))
.thenApply(future -> completableFutures.stream()
.map(CompletableFuture::join)
.flatMap(longMap -> longMap.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));
预计是
Caused by: java.util.concurrent.CompletionException: java.lang.NullPointerException
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.postComplete(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.postFire(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$Completion.exec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Caused by: java.lang.NullPointerException: null
at java.base/java.util.Objects.requireNonNull(Unknown Source)
at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator(Unknown Source)
这里的问题不是键而是值。你得到这个异常是因为一个值是空的。看起来 java.util.stream.Collectors#uniqKeysMapAccumulator
检查 Objects.requireNonNull
值。参见 NullPointerException in Collectors.toMap with null entry values
我有一个可抛出 NPE 的可完成的未来代码。我无法在本地重现异常。
我已尝试对代码进行验收测试和单元测试,但没有给出准确的错误响应。
final List<CompletableFuture<Map<K, V>>> completableFutures =
copy.stream()
.map(copy -> getRespForId(requestContext, copy))
.collect(Collectors.toList());
return CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture<?>[0]))
.thenApply(future -> completableFutures.stream()
.map(CompletableFuture::join)
.flatMap(longMap -> longMap.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));
预计是
Caused by: java.util.concurrent.CompletionException: java.lang.NullPointerException
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.postComplete(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.postFire(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture$Completion.exec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Caused by: java.lang.NullPointerException: null
at java.base/java.util.Objects.requireNonNull(Unknown Source)
at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator(Unknown Source)
这里的问题不是键而是值。你得到这个异常是因为一个值是空的。看起来 java.util.stream.Collectors#uniqKeysMapAccumulator
检查 Objects.requireNonNull
值。参见 NullPointerException in Collectors.toMap with null entry values