HOWTO · Java
Java 中的堆栈跟踪
本教程演示了堆栈跟踪是什么以及如何使用它来调试 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 有一个内置函数 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)
这个堆栈也可以像上面图片中描述的那样描述。