获取java列表的值时的StackOverFlowError

时间:2015-03-03 13:10:52

标签: java stack-overflow

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

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

有什么可能的原因?我无法重现该问题,但已从崩溃报告中看到了堆栈跟踪。

堆栈跟踪是:

java.lang.StackOverflowError
       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的相同的多次调用,源自设置枚举的行。

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

3 个答案:

答案 0 :(得分:0)

当您有一个递归过深的程序时,会发生堆栈溢出。引用official Oracle docs

  

当由于应用程序过于冗长而发生堆栈溢出时抛出。

由于您的代码段很短,因此几乎不可能说出错误源自何处。

答案 1 :(得分:0)

我建议增加java堆大小:

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

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

java -Xms64m -Xmx256m ...

试试这个,如果它没有重写您的代码以避免递归...

答案 2 :(得分:0)

看起来这是由于我对AbstractList.SubAbstractList(subList)的误解。 subList返回列表的视图,而不是新列表。我是在从同一个完整列表中获得的不同子列表上执行此操作。