我使用Java8 steam和CompletableFuture请求方法来获取返回值,是什么导致了此异常?我现在无法复制这个例外:
异常堆栈
java.lang.IllegalStateException
at java.util.stream.Nodes$FixedNodeBuilder.end(Nodes.java:1232)
at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:546)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
//This line is my code
at com.xxx.XxxxServiceImpl.getDetail(XxxxServiceImpl.java:222)
末端尺寸1小于固定尺寸2
public static void main(String[] args) {
ExecutorService executors = Executors.newFixedThreadPool(10);
List<Integer> list = Lists.newArrayList(1, 2);
Map<Integer, Long> map = new ConcurrentHashMap<>();
CompletableFuture.allOf(list.stream().map(obj -> CompletableFuture.supplyAsync(
() -> getValue(), executors)
.whenComplete((value, ex) -> {
if (ex != null) {
throw new BusinessException("exception" + ex);
} else {
map.put(obj, value);
}
})).toArray(CompletableFuture[]::new)).join();
}
static Long getValue(){
return System.currentTimeMillis();
}
类似的问题,但我没有修改这个地图并删除列表Java 8流:Java.lang.IollegalStateException:结束大小84758小于固定大小84764
类似的问题,但我没有修改这个映射并删除列表Java 8流:Java.lang.IllegalStateException:结束大小84758小于固定大小84764
好的,下面是您处理这个问题的方法。。。
为了使代码具有一定的稳定性,您需要隔离这段复杂的逻辑并通过测试来覆盖它。这将使隔离和重现问题变得更加容易。
出现此错误的原因是流中的某些元素可能引发异常,并且输出的大小小于输入的大小。
暂时尝试删除异常代码,看看它是否有效。如果它没有在评论中发布结果。
我也遇到了类似的问题。我发现我将HashSet
与parallelStream()
结合使用。由于HashSet
不是线程安全的,我用ConcurrentHashMap.newKeySet()
替换了它,从而解决了问题。