获取 java 列表的值时发生 StackOverFlowError

StackOverFlowError when getting value of java list

for(int i = 0; i < myList.size(); i++)
{
    myEnum = MyEnum.values()[myList.get(i).getMyInteger()];
}

上面的代码给我一个 WhosebugError,如下所示: java.util.AbstractList$SubAbstractList.get (AbstractList.java:292)

造成这种情况的可能原因有哪些?我无法重现该问题,但已从崩溃报告中看到堆栈跟踪。

堆栈跟踪是:

java.lang.WhosebugError
       at java.util.AbstractList$SubAbstractList.get(AbstractList.java:292)
       at java.util.AbstractList$SubAbstractList.get(AbstractList.java:292)
       at java.util.AbstractList$SubAbstractList.get(AbstractList.java:292)
       at java.util.AbstractList$SubAbstractList.get(AbstractList.java:292)
       at java.util.AbstractList$SubAbstractList.get(AbstractList.java:292)
       at java.util.AbstractList$SubAbstractList.get(AbstractList.java:292)
       at java.util.AbstractList$SubAbstractList.get(AbstractList.java:292)
       at java.util.AbstractList$SubAbstractList.get(AbstractList.java:292)
       at java.util.AbstractList$SubAbstractList.get(AbstractList.java:292)

许多对 getter 的相同调用源自设置枚举的行。

此处使用的列表是子列表。

当您的程序递归太深时会发生计算溢出。引用 official Oracle docs:

Thrown when a stack overflow occurs because an application recurses too deeply.

由于您的代码片段非常短,所以几乎不可能说出错误的来源。

我建议增加 java 堆大小:

-Xms 指定初始 Java 堆大小和 -Xmx 最大 Java 堆大小。

将最小值设置为 64Mb,将最大值设置为 256Mb

java -Xms64m -Xmx256m ...

试试这个,如果它不起作用重写你的代码以避免递归...

看来这是因为我对AbstractList.SubAbstractList(subList)的误解。 subList returns 列表的视图,而不是新列表。我正在对从同一个完整列表获得的不同子列表执行此操作。