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

标签 java jvm

这里是代码:

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/

相关文章:

jvm - 不同 JRE 中 JVM 之间的差异

Java 类文件规范 - double 和长整型表示

java - getActualMaximum 函数返回 kotlin 中不存在的值

java - 阿拉伯字体未在Samsung Devices中显示

java - 使用 gson 库读取 json 文件

java - 获取同一元素的运行时属性

java - Java中静态方法和静态变量存储在哪里?

Android 上的 Java 字节码注入(inject)

java - Eclipse java lwjgl java.library.path 中没有 lwjgl

java - JVM 在哪里存储原始变量?