相关疑难解决方法(0)

如何获得StackOverflowError的完整堆栈

观察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)

但我无法在堆栈跟踪中看到maina方法.我的猜测是因为溢出,堆栈中的最新条目取代了最旧的条目(?).

现在,如何在输出中获取amain堆栈条目?

其背景是,我得到了一个的StackOverflowError(但是这不是一个无限递归,因为增加堆栈大小时,它不会发生),它是很难发现代码中的问题.我只获取了多行java.util.regex.Pattern代码而不是代码所谓的信息.应用程序太复杂,无法在每次调用Patterns时设置断点.

java stack-overflow

31
推荐指数
1
解决办法
8720
查看次数

16
推荐指数
4
解决办法
8万
查看次数

递归调用期间的StackOverflowError

这个问题严格来说是理论上的,但我找不到答案.考虑这个简短的程序:

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)

问题是:

  1. 为什么println()没有完成新行,因为根据我的理解,当执行下一个rec()调用时它应该抛出一个错误并且它是在AFTER println()完成之后

  2. 为什么我只在stackTrace阵列中获得1024个元素但i等于10474?这是否意味着不是每个调用都在堆栈跟踪中?

java

9
推荐指数
2
解决办法
908
查看次数

标签 统计

java ×3

stack-overflow ×2

exception ×1

java-ee ×1