Java 中的堆栈跟踪

Sheeraz Gul 2024年2月15日
  1. 演示 Java 中的堆栈跟踪
  2. 在 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)

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

作者: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook