This question already has answers here:
What is the maximum depth of the java call stack?
(4个答案)
7年前关闭。
根据Oracle,StackOverflowError是:
我知道什么是递归,通常递归函数(如果未正确终止)会导致StackOverflowError。为了检查在抛出
每次运行中
我的查询是?
JVM抛出之前递归必须进行的深度 有了
被扔了吗?
但是,请注意以下有关错误的内容(来自Java API文档):
编辑:
注意事项:虽然在递归函数中捕获异常是可以的,但不要 try catch 错误。如果堆栈已满,则错误处理将导致新的错误。简单的事情(例如,调用
这就是为什么应该在递归函数之外捕获错误的原因。
(4个答案)
7年前关闭。
根据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
我的查询是?
StackOverflowError
? StackOverflowError
后,我们可以恢复吗被扔了吗?
最佳答案
深度取决于两件事:
1:堆栈的大小。
2:每次递归中使用的堆栈空间量。
函数参数,局部变量和返回地址都在堆栈上分配,而对象在堆上分配。
恢复
有可能恢复。
try {
myDeepRecursion();
} catch (StackOverflowError e) {
// We are back from deep recursion. Stack should be ok again.
}
但是,请注意以下有关错误的内容(来自Java API文档):
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.
编辑:
注意事项:虽然在递归函数中捕获异常是可以的,但不要 try catch 错误。如果堆栈已满,则错误处理将导致新的错误。简单的事情(例如,调用
System.out.println()
)将失败,因为堆栈上没有剩余用于返回地址的空间。这就是为什么应该在递归函数之外捕获错误的原因。
关于java - 什么时候发生StackOverflowError?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20658264/
10-10 19:22