我在用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 上搜索异常,但没有找到有关该错误的任何有用信息。谁能准确地告诉我这个错误的原因是什么?
EDIT
这是它的单行代码:
visits.getVisitDataMap().values().stream().toArray(n -> new VisitDataBE[n]);
您当前的代码是正确的,因为您正在创建正确大小的数组。你可以将其简化为.toArray(VisitDataBE[]::new)
.
最有可能的是其他线程正在从中删除元素visits.getVisitDataMap()
地图同时toArray()
在跑。您可以通过创建一个防御性副本来测试这个假设Map
:
Map<...> copy = new HashMap<>(visits.getVisitDataMap());
copy.values().stream().toArray(n -> new VisitDataBE[n]);
正确的修复取决于您的应用程序多线程语义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)