如何通过更改 java 代码来解决 StackOverflowError

How to resolve StackOverflowError by changes in java code

我在使用递归函数时得到 java.lang.WhosebugError。

实际上在递归函数中 xml 文件已经被解析,如果在 xml 文件中,先前的 xml feed url 存在,那么 xml 再次传递给相同的函数,然后在此 xml 文件中,先前的 xml 提要 url 存在,然后再次传递给相同的函数。

此过程一直持续到它获得前一个 xml 提要 url。我没有收到 10,000 个文件的错误,但之后当第 10,001 个文件再次发生相同的函数调用时,我得到 java.lang.WhosebugError。我想通过更改编码来解决此错误,而不是通过增加内存,尝试实现解决方案,例如对固定批量大小进行递归调用。

如果您能为 WhosebugError 提供更好的解决方案,请告诉我。如果您实施过此类解决方案,则要求提供部分解决方案代码。

此致, 肖特

一般答案,因为您的代码描述有点含糊:

WhosebugError 当您需要的堆栈多于分配的堆栈时会发生 - 这很简单。在嵌套方法调用的堆栈中,无论它们是否递归,每个方法调用都需要一定数量的堆栈,这由方法中的参数和局部变量的数量决定。因此,为了减少对堆栈的要求,您可以减少嵌套方法调用,或者减少方法中的参数和局部变量。两者都需要重新设计您的软件。

特别危险的是递归调用。如果您无法提前知道最多会发生多少次嵌套递归调用,则出现 WhosebugError 的风险非常高。

您的描述听起来有点像在由 url 和链接形成的图中进行深度优先搜索(通过递归实现)。如果您可以将其更改为广度优先搜索(通常通过迭代实现),那么就没有理由再使用 Whosebug。当然,这两个搜索都需要一个终止条件,这样你就不会永远陷入循环。

目前,我已使用 try/catch 块解决了问题。我捕获 WhosebugError 并将处理的最后一个文件存储在内存中。然后,我再次调用该方法并从发生 WhosebugError 的文件开始。

更新: 现在,我已经为 WhosebugError 实施了更好的解决方案。我正在处理一批可配置大小的 运行。例如,进程将以 100 个大小为一批进行处理,如果需要进一步处理,将在下一批处理。