【发布时间】:2014-01-06 15:19:14
【问题描述】:
根据 Oracle 的说法,StackOverflowError 是:
由于应用程序递归太深而发生堆栈溢出时引发。
我知道什么是递归,通常递归函数,如果没有正确终止,会导致 StackOverflowError。为了检查在StackOverflowError 被抛出之前发生的递归调用的数量,我编写了以下代码:
package ErrorCases;
public class StackOverFlowError {
static int i=0;
void a()
{
//System.out.println("called "+(++i));
try{
++i;
a();
}catch(Error e)
{
System.out.println(e.getClass());
System.out.println(i);
}
}
public static void main(String[] args) {
new StackOverFlowError().a();
}
}
i 的值给出了在 JVM 抛出 StackOverflowError 之前对 a() 的递归调用计数。i 的值在每次运行中都不同,例如:
output 1: class java.lang.StackOverflowError
10466
Output 2: class java.lang.StackOverflowError
10470
我的查询是?
在 JVM 抛出之前,递归必须发生多深
StackOverflowError?一旦
StackOverflowError有 被扔了?
【问题讨论】:
-
从堆栈溢出中恢复需要完全禁欲——哎呀,我的意思是非常不确定。如果代码当时正在进行一些复杂的操作,则可能没有足够的堆栈空间允许它退出。并且许多正在进行的操作可能无法防止此类故障,并且根本无法退出/重置。
-
我读了很长时间的最佳问题。让我思考!谢谢
标签: java recursion stack stack-overflow