获取 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 列表的视图,而不是新列表。我正在对从同一个完整列表获得的不同子列表执行此操作。
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 列表的视图,而不是新列表。我正在对从同一个完整列表获得的不同子列表执行此操作。