Java中的无限递归?

Java中的无限递归?,java,Java,显然,Java中的以下递归将导致堆栈溢出错误: public class XXX { public static void main(String[] args) { main(null); } } 但是如果我捕捉到这个错误并再次调用该函数呢 public class XXX { public static void main(String[] args) { try { main(null); }

显然,Java中的以下递归将导致堆栈溢出错误:

public class XXX {
    public static void main(String[] args) {
        main(null);
    }
}
但是如果我捕捉到这个错误并再次调用该函数呢

public class XXX {
    public static void main(String[] args) {
        try {
            main(null);
        } catch(StackOverflowError E) {
            main(null);
        }
    }
}

那么它是如何执行的呢?

程序最终将停止,因为
catch
块中对
main(null)
的调用不会再次捕获
StackOverflowError
StackOverflowerError
最终将沿着堆栈向下传播

您可以通过使用
-Xss108k
JVM选项(我的JVM上可能的最低值)减小堆栈大小,并更改程序以在堆栈上尽可能多地分配,例如使用本地
变量:

public static void main(String... args) {
  try {
    double a00 = 0.13;
    double a01 = 0.13;
    ...
    double a99 = 0.13;
    double b00 = 0.13;
    double b01 = 0.13;
    ...
    double k99 = 0.13;

    main(null);
  } catch (StackOverflowError ex) {
    main(null);
  }
}

这会导致在5次递归调用后抛出
StackOverflowerError
,程序退出。

为什么不试试呢?让我们知道问题是什么result@BoWang为什么不呢?我想,在用完所有可用的堆内存之前,您仍然会抛出
StackOverflowException
s。实际上,这是行不通的。因为
try/catch
中的第二个调用不是
try/catch
'd;)@阿列克斯特。它被捕获了,但是在堆栈中较高的一级,它最终会结束,但是如果堆栈允许
n
调用,我认为在顶级catch中对main的顶级调用最终抛出并导致程序退出之前,这将执行
2^n
调用。这没有无限循环那么有意义,也不是一个好主意。如果
main
调用了可能调用其他方法的任何其他方法,则在每次迭代中,它将根据调用
main
开始时调用堆栈的深度,在
main
内随机抛出点。由于@Alex T.注意到这一点,它最终也会停止迭代,尽管它会运行很长时间。@Paulpro谢谢你指出这一点,你是对的。没问题,演示得很好。