java - Java:将 Map.keySet() 保存到 ArrayList 会引发 StackOverflowError
问题描述
我正在编写电梯模拟程序。如果我只运行几次模拟(大约:1-50 次),通常不会发生 StackOverflowError。但是,我必须大约运行模拟。1000 次。
我有不同的课程。执行以下命令时,错误发生在类“n_AlgorithmMain”中:
waitingPassengerId = new ArrayList<>(waitingPassengerMap.keySet());
。“WaitingPassengerId”的创建方式如下:
private List<Integer> waitingPassengerId;
。
整个功能是:
protected LinkedListMultimap<Integer, Integer> filledInsidePassengerMap(LinkedListMultimap<Integer,Integer> waitingPassengerMap, int currentFloor){
servedWaitingPassengerId = new ArrayList<>();
waitingPassengerId = new ArrayList<>(waitingPassengerMap.keySet());
for(int i = 0; i < waitingPassengerId.size() ; i++){
waitingPassengerValues = waitingPassengerMap.get(waitingPassengerId.get(i));
passengerStartFloor = fetchPassengerStartFloor(waitingPassengerValues);
if(passengerStartFloor == currentFloor){
for(int j = 0; j < waitingPassengerValues.size(); j++){
insidePassengerMap.put(waitingPassengerId.get(i), waitingPassengerValues.get(j));
}
servedWaitingPassengerId.add(waitingPassengerId.get(i));
}
}
waitingPassengerMap = adjustedMap(waitingPassengerMap, servedWaitingPassengerId);
return insidePassengerMap;
}
我不确定,但问题可能是由“n_AlgorithmStandard”类中的以下代码触发的,因为上述函数是从“n_AlgorithmStandard”调用的:
insidePassengerMap = filledInsidePassengerMap(standardWaitingPassengerMap, standardCurrentFloor);
。
我认为它也会在以下行触发,目前尚未达到:
finishedPassengerMap = filledFinishedPassengerMap(insidePassengerMap, standardCurrentFloor);
.
这些映射初始化如下:
private LinkedListMultimap<Integer, Integer> insidePassengerMap = LinkedListMultimap.create();
和
private LinkedListMultimap<Integer, Integer> finishedPassengerMap = LinkedListMultimap.create();
。
“n_AlgorithmStandard”中的整个函数如下所示:
private void processOneFloor() {
standardWaitingPassengerMap = filledWaitingPassengerMap(timeMap, standardCurrentFloor, isRfid, emptyRandomAmountList);
currentSumRandomAmount = getSumRandomAmount();
insidePassengerMap = filledInsidePassengerMap(standardWaitingPassengerMap, standardCurrentFloor);
finishedPassengerMap = filledFinishedPassengerMap(insidePassengerMap, standardCurrentFloor);
moveElevator();
if (currentSumRandomAmount < passengerAmountTotal) {
processOneFloor();
} else if (currentSumRandomAmount == passengerAmountTotal){
processRemainingPassengers(standardWaitingPassengerMap, insidePassengerMap);
remainingPassengersAmountStandard = getRemainingPassengersAmount();
for (int i = 0; i < remainingPassengersAmountStandard; i++){
processOneFloor();
}
}
}
错误:
Exception in thread "main" java.lang.StackOverflowError
at java.util.HashMap.putVal(HashMap.java:629)
at java.util.HashMap.put(HashMap.java:612)
at java.util.HashSet.add(HashSet.java:220)
at com.google.common.collect.LinkedListMultimap$DistinctKeyIterator.next(LinkedListMultimap.java:448)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at n_AlgorithmMain.filledInsidePassengerMap(n_AlgorithmMain.java:309)
at n_AlgorithmStandard.processOneFloor(n_AlgorithmStandard.java:142)
最后一行在 Stacktrace 中出现了 100 次。
解决方案
推荐阅读
- cmake - CMake 自定义命令调用了两次
- javascript - 从浏览器发送请求从 HTTPS 到 HTTP,混合内容
- sql - 如何从不同的数据库中获取行数。数据库名称、模式名称和表名称,存储在 SQL 表中
- python - 使用和条件循环列表
- java - Java:两个线程通过扫描仪打印和接收用户输入:抛出异常后程序不退出
- c - 我的代码不起作用,我不知道为什么;-;
- python - Google Colab - NotImplementedError
- go - 您是否应该使用零“枚举”值来指示无效值
- java - JButton 仅在我将鼠标移过时出现
- vue.js - Vue-test-utils 无法在空包装器上调用文本