printstacktrace() 通过调用 throwable 的 fillinstacktrace() 方法获取当前线程的栈帧快照,并逐行打印类名、方法名、文件名和行号。它默认将堆栈信息输出到标准错误流(system.err),便于在控制台快速定位异常发生的具体位置。

如何捕获并查看具体的堆栈信息
要查看堆栈信息,只需在 try-catch 块中捕获异常对象并调用其 printStackTrace() 方法即可。该方法会遍历异常链,打印出从抛出点到当前处理点的完整调用路径。

public class StackTraceDemo {
public static void main(String[] args) {
try {
divide(10, 0);
} catch (Exception e) {
System.out.println("--- Start Stack Trace ---");
e.printStackTrace();
System.out.println("--- End Stack Trace ---");
}
}
private static void divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("Division by zero");
}
System.out.println(a / b);
}
}运行上述代码,控制台将输出类似如下的堆栈跟踪信息:
立即学习“Java免费学习笔记(深入)”;
--- Start Stack Trace --- java.lang.ArithmeticException: Division by zero at com.example.StackTraceDemo.divide(StackTraceDemo.java:14) at com.example.StackTraceDemo.main(StackTraceDemo.java:6) --- End Stack Trace ---
其中第一行显示异常类型和消息,后续每行以 at 开头,依次展示调用层级、类名、方法名、文件名及行号。最底部的 main 方法是入口点,顶部的 divide 方法是异常实际抛出的位置。
如何将堆栈信息转换为字符串以便记录
若需将堆栈信息保存至日志文件或通过网络传输,可使用 StringWriter 结合 PrintWriter 捕获 printStackTrace() 的输出。这种方式避免了直接操作 System.err,使堆栈数据可被程序化处理。

import java.io.PrintWriter;
import java.io.StringWriter;
public class StackTraceToString {
public static String getStackTrace(Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
return sw.toString();
}
public static void main(String[] args) {
try {
throw new NullPointerException("Test NPE");
} catch (Exception e) {
String stackStr = getStackTrace(e);
System.out.println(stackStr);
}
}
}该示例中,e.printStackTrace(pw) 将堆栈信息写入 PrintWriter,进而存入 StringWriter。最终返回的字符串包含完整的堆栈文本,可直接用于日志记录或调试分析。
自定义异常时堆栈信息是否包含额外字段
自定义异常类继承自 Exception 后,printStackTrace() 输出的内容与内置异常一致,不会自动添加自定义字段的值。若需在堆栈中体现业务上下文,应在构造函数中设置详细消息,或在捕获后手动拼接相关信息。


















