这里是代码:
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();
。在这种情况下为什么我会得到不同的结果?
提前致谢!
最佳答案
正如您自己所注意到的,Thread.currentThread().getStackTrace()
调用 (new Exception()).getStackTrace();
这意味着前者的堆栈跟踪将恰好长一帧。
如果一个方法调用另一个方法,则根据定义,它们的堆栈跟踪不能相同。
关于java - 为什么使用 java.lang.Throwable#getStackTrace 和 java.lang.Thread#getStackTrace 得到不同的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48541929/