解决java.lang.StackOverflowError内存问题

时间:2011-08-18 11:15:16

标签: java eclipse memory recursion stack-overflow

我正在使用递归函数,执行时遇到此错误:

Exception in thread "main" java.lang.StackOverflowError
    at java.util.HashMap$Entry.<init>(Unknown Source)
    at java.util.HashMap.addEntry(Unknown Source)
    at java.util.HashMap.put(Unknown Source)

我对这种方法不满意,并且100%确定它在某个时候结束。

所以我认为它与记忆问题有关。

有没有解决方案?

  

编辑:

public static Vector<String> _toOpen;

public static void openFiles(Vector<String> files)
{       
   ...

    while(actualFile.hasNext)
    {
        if(!_toOpen.contains(word))
        {
           _toOpen.add(word);
            System.out.println("word");
        }
    }

   ...

   if(_toOpen.size() > 0)
   {
       openFiles(_toOpen);
   }
}

在第一次调用时,我传递给OpenFiles一个包含要打开的文件列表的Vector,每个文件都有一个要再次打开的文件列表,等等......

我正在做的是阻止文件打开,如果它之前是dopne。

2 个答案:

答案 0 :(得分:4)

查看您的代码 - 您对if的最终通话是否有条件(例如openFiles(_toOpen))?

如果没有,则每次调用openFiles时,它都会递归调用。无论堆栈的最大大小是多少,这个方法都不会真正返回,你实际上已经有了无限循环。

如果事先有一些条件,你显然会遇到一直在评估true(或任何导致递归调用)的情况。


除此之外,看起来您可以重新构建代码以避免这种情况。你正试图用_toOpen做什么?为什么你似乎忽略了传入的files参数(我很欣赏有删除的代码,并且可能会将内容复制到_toOpen,但这至少可以说是不寻常的。)

递归调用似乎不是解决此问题的最佳方法,除非您遇到一些奇怪的情况,例如引用其他文件打开的文件。

答案 1 :(得分:1)

我认为问题出在你的逻辑和_toOpen.size() > 0的测试中。

执行_toOpen.add(word);后,_toOpen.size()始终大于0,因此if条件始终为true,并且该函数将始终递归。


您说“但_toOpen.add(word);并非始终触发” - 但必须在应用程序生命周期中仅触发 才能使此方法无限期递归。

你的Vector _toOpen是 static ,这意味着只有一个,这意味着只要触发_toOpen.add(word);,语句{{1 始终成立。