This question already has answers here:
What is the maximum depth of the java call stack?

(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

我的查询是?
  • JVM抛出之前递归必须进行的深度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