Java:将Map.keySet()保存到ArrayList中会抛出StackOverflowError。

huangapple 未分类评论50阅读模式
英文:

Java: Saving Map.keySet() into ArrayList throws 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)

这最后一行在堆栈跟踪中出现了大约100次。

英文:

I'm programming an elevator simulation. If I run the simulation only a few times (approx: 1-50 times), the StackOverflowError usually doesn't occur. However, I have to run the simulation approx. 1000 times.

I have different classes. The error occurs in class "n_AlgorithmMain" when the following is executed:
waitingPassengerId = new ArrayList&lt;&gt;(waitingPassengerMap.keySet());. "WaitingPassengerId" is created like:
private List&lt;Integer&gt; waitingPassengerId;.

The whole function is:

protected LinkedListMultimap&lt;Integer, Integer&gt; filledInsidePassengerMap(LinkedListMultimap&lt;Integer,Integer&gt; waitingPassengerMap, int currentFloor){

    servedWaitingPassengerId = new ArrayList&lt;&gt;();

    waitingPassengerId = new ArrayList&lt;&gt;(waitingPassengerMap.keySet());

    for(int i = 0; i &lt; waitingPassengerId.size() ; i++){
        waitingPassengerValues = waitingPassengerMap.get(waitingPassengerId.get(i));
        passengerStartFloor = fetchPassengerStartFloor(waitingPassengerValues);
        if(passengerStartFloor == currentFloor){
            for(int j = 0; j &lt; waitingPassengerValues.size(); j++){
                insidePassengerMap.put(waitingPassengerId.get(i), waitingPassengerValues.get(j));
            }
            servedWaitingPassengerId.add(waitingPassengerId.get(i)); 
        }
    }
    waitingPassengerMap = adjustedMap(waitingPassengerMap, servedWaitingPassengerId);
    return insidePassengerMap;
}

I'm not sure but maybe the problem is triggered by the following code in class "n_AlgorithmStandard", because the above function is called from "n_AlgorithmStandard":
insidePassengerMap = filledInsidePassengerMap(standardWaitingPassengerMap, standardCurrentFloor);.

I think that it would also be triggered at the following line, which is currently not reached:
finishedPassengerMap = filledFinishedPassengerMap(insidePassengerMap, standardCurrentFloor);.

These maps were initialized as follows:

private LinkedListMultimap&lt;Integer, Integer&gt; insidePassengerMap = LinkedListMultimap.create();
and
private LinkedListMultimap&lt;Integer, Integer&gt; finishedPassengerMap = LinkedListMultimap.create();.

The whole function in "n_AlgorithmStandard" looks like these:

private void processOneFloor() {

    standardWaitingPassengerMap = filledWaitingPassengerMap(timeMap, standardCurrentFloor, isRfid, emptyRandomAmountList); 
    currentSumRandomAmount = getSumRandomAmount();

    insidePassengerMap = filledInsidePassengerMap(standardWaitingPassengerMap, standardCurrentFloor);
    finishedPassengerMap = filledFinishedPassengerMap(insidePassengerMap, standardCurrentFloor);

    moveElevator();

    if (currentSumRandomAmount &lt; passengerAmountTotal) {
        processOneFloor();
    } else if (currentSumRandomAmount == passengerAmountTotal){
        processRemainingPassengers(standardWaitingPassengerMap, insidePassengerMap);
        remainingPassengersAmountStandard = getRemainingPassengersAmount();

        for (int i = 0; i &lt; remainingPassengersAmountStandard; i++){
            processOneFloor();
        }
    }
}

The error:

Exception in thread &quot;main&quot; 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)

The last line occurs like 100 times in the Stacktrace.

huangapple
  • 本文由 发表于 2020年5月30日 01:26:10
  • 转载请务必保留本文链接:https://java.coder-hub.com/62091472.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定