Java中的无限递归?
显然,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); }
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谢谢你指出这一点,你是对的。没问题,演示得很好。