我正在使用 Java 8 streams
API 将映射值转换为数组。我收到以下异常:
Unhandled exception ScheduledExecutorService : java.lang.IllegalStateException: End size 84758 is less than fixed size 84764
at java.util.stream.Nodes$FixedNodeBuilder.end(Nodes.java:1232)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:545)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
at com.turnoutnow.businesslogic.Worker.generateVisitsToESAndS3(Worker.java:213)
我正在 Google 上搜索异常,但没有找到任何关于该错误的有用信息。谁能告诉我这个错误的确切原因是什么?
编辑
这是一行代码:
visits.getVisitDataMap().values().stream().toArray(n -> new VisitDataBE[n]);
最佳答案
您当前的代码是正确的,因为您正在创建大小合适的数组。您可以将其简化为 .toArray(VisitDataBE[]::new)
。
很可能在 toArray()
运行时,其他线程正在从 visits.getVisitDataMap()
映射中删除元素。您可以通过创建 Map
的防御副本来检验这个假设:
Map<...> copy = new HashMap<>(visits.getVisitDataMap());
copy.values().stream().toArray(n -> new VisitDataBE[n]);
正确的修复取决于您的应用程序的多线程语义。
关于Java 8 流 : java. lang.IllegalStateException:结束大小 84758 小于固定大小 84764,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57274369/