Java 中的堆栈跟踪

在 Java 中,堆栈跟踪是一个堆栈数组。堆栈跟踪收集程序运行的所有方法的信息,并告诉我们控制台中异常或错误的位置。

当抛出异常或发生错误时,JVM 会自动显示堆栈跟踪。

本教程将演示什么是堆栈跟踪以及如何使用它来调试我们的代码。

演示 Java 中的堆栈跟踪

让我们运行一个简单的示例来显示 Java 中的堆栈跟踪,然后对其进行描述:

package delftstack;
public class Java_Stack_Trace {
    public static void main(String args[]){
        try {
            String demo = null;
            System.out.println(getString(demo));
        }
        catch(NullPointerException e) {
            throw new IllegalStateException(e);
        }
    }
    public static String getString(String demo) {
        System.out.println(demo.toString());
        return demo;
    }
}

上面的代码运行一个方法来获取字符串,我们传递一个空字符串作为参数。我们尝试捕获空指针异常。

代码将捕获异常并显示跟踪。

输出:

Exception in thread "main" java.lang.IllegalStateException: java.lang.NullPointerException: Cannot invoke "String.toString()" because "demo" is null
    at Delftstack/delftstack.Java_Stack_Trace.main(Java_Stack_Trace.java:10)
Caused by: java.lang.NullPointerException: Cannot invoke "String.toString()" because "demo" is null
    at Delftstack/delftstack.Java_Stack_Trace.getString(Java_Stack_Trace.java:15)
    at Delftstack/delftstack.Java_Stack_Trace.main(Java_Stack_Trace.java:7)

当代码抛出空指针异常时,输出显示堆栈跟踪。行号为 10 的最顶层方法调用是此异常的原因。

堆栈跟踪还告诉我们,由于字符串 demo 在第 7 行为空,因此引发了空点异常。下图进一步描述了此堆栈跟踪:

Java 中的堆栈跟踪

在 Java 中转储堆栈跟踪

堆栈跟踪包含包、类、方法和行的信息。Java 有一个内置函数 Thread.dumpStack() 来转储所有堆栈跟踪信息。

package delftstack;
public class Java_Stack_Trace {
    public static void main(String args[]){
        Stack_Trace_Demo();
    }
    static void Stack_Trace_Demo(){
        Stack_Trace_Demo1();
    }
    static void Stack_Trace_Demo1(){
        Stack_Trace_Demo2();
    }
    static void Stack_Trace_Demo2(){
        Stack_Trace_Demo3();
    }
    static void Stack_Trace_Demo3(){
        Stack_Trace_Demo4();
    }
    static void Stack_Trace_Demo4() {
        Thread.dumpStack();
    }
}

上面的代码包含四个演示方法,然后我们在最后一个方法中调用了 dumpstack()。它将显示所有堆栈跟踪信息。

输出:

java.lang.Exception: Stack trace
    at java.base/java.lang.Thread.dumpStack(Thread.java:1380)
    at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo4(Java_Stack_Trace.java:21)
    at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo3(Java_Stack_Trace.java:18)
    at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo2(Java_Stack_Trace.java:15)
    at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo1(Java_Stack_Trace.java:12)
    at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo(Java_Stack_Trace.java:9)
    at Delftstack/delftstack.Java_Stack_Trace.main(Java_Stack_Trace.java:5)

这个堆栈也可以像上面图片中描述的那样描述。