最简单的方法来检测它会抛出一个错误是等到它抛出和错误并捕获它。
try {
action();
} catch(StackOverflowError ste) {
// you can't call anything here safely, but you can return or unwind the stack.
}
注意:最大堆栈大小因机器而异,并基于命令行设置。它不基于多个呼叫。
如果你真的关心这个问题,我建议改变代码,它不使用递归,你完全避免这个问题。
的问题是最大的堆栈深度显示/记录是1024。如果你有一个较长的堆栈,你不会看到什么原因造成的最初。你可以做的是减少与-Xss128k
(或更少,如果你的JVM允许的话)的最大堆栈大小,以便你的堆栈跟踪总是足够短以便捕获。
public static void main(String... ignored) {
callMe(1);
}
private static void callMe(int i) {
callMe(i);
}
时用较小的堆栈大小
at Main.callMe(Main.java:42)
at Main.callMe(Main.java:42)
at Main.callMe(Main.java:42)
many deleted
at Main.callMe(Main.java:42)
at Main.callMe(Main.java:42)
at Main.callMe(Main.java:42)
at Main.main(Main.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
如果我理解正确,当有太多函数调用时会发生stackoverflow? – 2013-04-25 08:08:40
当必要的函数调用太多时不适用。相反,当有太多待处理的函数回调 - 当你调用一个函数时,程序必须返回到它离开的地方。它把这个位置放在堆栈上。 – Zyerah 2013-04-25 08:09:49
@Telthien先生请看看这个查询http://stackoverflow.com/questions/16055441/computing-method-call-stack-size – 2013-04-25 08:16:43