观察StackOverflowError时如何检索完整的调用堆栈?
考虑这个简单的例子:
public class Overflow {
public Overflow() {
new Overflow();
}
public static void a() {
new Overflow();
}
public static void main(String[] argv) {
a();
}
}
Run Code Online (Sandbox Code Playgroud)
现在报告的错误是:
Exception in thread "main" java.lang.StackOverflowError
at Overflow.<init>(Overflow.java:11)
[last line repeated many times]
Run Code Online (Sandbox Code Playgroud)
但我无法在堆栈跟踪中看到main和a方法.我的猜测是因为溢出,堆栈中的最新条目取代了最旧的条目(?).
现在,如何在输出中获取a和main堆栈条目?
其背景是,我得到了一个的StackOverflowError(但是这不是一个无限递归,因为增加堆栈大小时,它不会发生),它是很难发现代码中的问题.我只获取了多行java.util.regex.Pattern代码而不是代码所谓的信息.应用程序太复杂,无法在每次调用Patterns时设置断点.
如何StackOverflowError在Java中处理?
这个问题严格来说是理论上的,但我找不到答案.考虑这个简短的程序:
public class SBtst {
int i = 0;
public static void main(String[] args) {
new SBtst().rec();
}
public void rec() {
System.out.println("rec is called "+i++);
try {
rec();
} catch (StackOverflowError soe) {
System.out.println("completed "+soe.getStackTrace().length);
}
}
}Run Code Online (Sandbox Code Playgroud)
执行后我输出类似于:
rec is called 10472
rec is called 10473
rec is called 10474Recursion completed 1024
Run Code Online (Sandbox Code Playgroud)
问题是:
为什么println()没有完成新行,因为根据我的理解,当执行下一个rec()调用时它应该抛出一个错误并且它是在AFTER println()完成之后
为什么我只在stackTrace阵列中获得1024个元素但i等于10474?这是否意味着不是每个调用都在堆栈跟踪中?