检测它是否会抛出错误的最简单方法是等到它抛出错误并捕获它。
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)