我正在使用递归函数,执行时遇到此错误:
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。
答案 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 始终成立。