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 中转储堆栈跟踪

堆栈跟踪包含包、类、方法和行的信息。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)

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