Я программирую симуляцию лифта. Если я запускаю симуляцию всего несколько раз (примерно 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 раз.