跳转至内容

堆栈跟踪

75% developed
来自维基教科书,开放书籍,开放世界

导航 异常 主题:v  d  e )


堆栈跟踪是从应用程序启动时到程序执行当前位置的所有方法调用列表。当异常被抛出时,Java 虚拟机会自动生成堆栈跟踪,以指示异常发生的点以及程序到异常发生的点为止的执行过程。 最近的方法调用位于列表顶部。

Computer code 代码清单 6.3:StackTraceExample.java
public class StackTraceExample {
  public static void main(String[] args) {
    method1();
  }

  public static void method1() {
    method11();
  }

  public static void method11() {
    method111();
  }

  public static void method111() {
    throw new NullPointerException("Fictitious NullPointerException");
  }
}
Standard input or output 代码清单 6.3 的输出
Exception in thread "main" java.lang.NullPointerException: Fictitious NullPointerException
at StackTraceExample.method111(StackTraceExample.java:15)
at StackTraceExample.method11(StackTraceExample.java:11)
at StackTraceExample.method1(StackTraceExample.java:7)
at StackTraceExample.main(StackTraceExample.java:3)

通过调用异常的 public void printStackTrace() 方法,可以将堆栈跟踪打印到标准错误流。

从 Java 1.4 开始,堆栈跟踪被封装在一个名为 java.lang.StackTraceElement 的 Java 类的数组中。堆栈跟踪元素数组由 Throwable.getStackTrace() 方法返回。每个元素代表一个单独的堆栈帧。除堆栈顶部的帧外,所有堆栈帧都代表方法调用。堆栈顶部的帧代表生成堆栈跟踪的执行点。通常,这是创建与堆栈跟踪相对应的可抛出对象的点。

堆栈帧代表以下信息

Example 代码节 6.24:堆栈帧。
public StackTraceElement(String declaringClass,
                         String methodName,
                         String fileName,
                         int lineNumber);

创建一个表示指定执行点的堆栈跟踪元素。

将堆栈跟踪转换为字符串

[编辑 | 编辑源代码]

在许多情况下,为了调试的目的,我们希望将堆栈跟踪转换为一个 字符串,以便我们可以将其记录到我们的日志文件中。

以下代码展示了如何做到这一点

Example 代码节 6.25:保存堆栈跟踪。
import java.io.StringWriter;
import java.io.PrintWriter;

...

  Exception e = new NullPointerException();

  StringWriter outError = new StringWriter();
  e.printStackTrace(new PrintWriter(outError));
  String errorString = outError.toString();

  // Do whatever you want with the errorString


Clipboard

待办事项
添加一些类似于 变量 中的练习


华夏公益教科书