为什么我使用java.lang.Throwable#getStackTrace和java.lang.Thread#getStackTrace获得不同的堆栈跟踪

slesh:

这是代码:

package stacktrace.test;

public class A {
    public static void main(String[] args) {
        B.f();
    }
}

interface B {
    static void f() {
        C.f();
    }
}

interface C {
    static void f() {
        StackTraceElement[] stackTrace1 = (new Exception()).getStackTrace();
        StackTraceElement[] stackTrace2 = Thread.currentThread().getStackTrace();
        StackTraceElement x1 = stackTrace1[1];
        StackTraceElement x2 = stackTrace2[1];
        System.out.println(x1.getClassName());
        System.out.println(x2.getClassName());
    }
}

并输出:

stacktrace.test.B
stacktrace.test.C

我检查Thread.currentThread().getStackTrace()它的调用(new Exception()).getStackTrace();在这种情况下,为什么我得到不同的结果?

提前致谢!

apangin:

正如您已经正确注意到的那样,Thread.currentThread().getStackTrace()调用(new Exception()).getStackTrace();意味着前者的堆栈跟踪将恰好长一帧。

如果一个方法调用另一个,则其堆栈跟踪在定义上就不可能相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章