Java Stack Trace

2025 年 3 月 31 日 | 阅读 3 分钟

在 Java 中,堆栈跟踪 (stack trace) 实际上就是异常的位置。换句话说,我们可以说堆栈跟踪会追溯 (trace) 异常可能引发的下一行代码。在本节中,我们将详细讨论 Java 堆栈跟踪

什么是堆栈跟踪?

Java 中,堆栈跟踪是堆栈帧 (stack frames) 的一个数组。它也称为堆栈回溯 (stack backtrace)(或 backtrace)。堆栈帧表示程序执行期间应用程序的移动。它会追溯引发异常的位置。

它收集程序调用的所有方法的有关信息。当我们不关心未捕获的异常而程序抛出异常时,Java 堆栈跟踪默认会在控制台上打印堆栈跟踪。JVM 在抛出异常时会自动生成堆栈跟踪。在堆栈跟踪中,每个元素都代表一个方法调用。

Java Stack Trace

Java Throwable 类提供了 printSatckTrace() 方法,用于在控制台上打印堆栈跟踪。

在 Java 1.5 引入之后,堆栈跟踪被封装到一个称为 StackTraceElement 的 Java 类数组中。这个数组由 Throwable 类的 getStackTrace() 方法返回。

每个元素由一个堆栈帧表示。所有堆栈帧都表示方法调用,除了第一个帧(顶部)。第一个帧表示 JVM 生成堆栈跟踪的执行点。

StackTraceElement 类提供了一个构造函数,它接受四个参数,并创建一个表示指定执行点的堆栈跟踪元素。

参数

  • declaringClass: 包含执行点的类的限定名称。
  • methodName: 它表示包含执行点的方法名称。
  • fileName: 它表示包含执行点的文件名。
  • lineNumber: 它表示执行点源的行号。

如果参数 declaringClassmethodName 为 null,它将抛出 NullPointerException

让我们看看堆栈跟踪的文本表示(语法)。

让我们来理解堆栈跟踪。

第一行表示

Java Stack Trace

其他行表示

Java Stack Trace

Java 堆栈跟踪示例

StackTraceExample.java

让我们运行上面的程序,看看堆栈跟踪。

Java Stack Trace

在堆栈跟踪的第一行,我们得到堆栈的执行点,从第二行到最后一行,我们得到构成完整堆栈跟踪的堆栈帧。我们看到最先执行的方法成为堆栈跟踪的最后一个堆栈帧,而最后执行的方法成为堆栈跟踪的第一个堆栈帧。因此,堆栈跟踪的每个元素都代表一个堆栈帧。