ExceptionUtils.getStackTrace()可获取带换行的完整堆栈字符串,但需引入Apache Commons Lang3依赖,因其非JDK原生类;若无法引入,可用StringWriter+PrintWriter手动实现等效逻辑。

直接用 ExceptionUtils.getStackTrace() 就能拿到带换行的完整堆栈字符串,但前提是你要先引入 Apache Commons Lang —— 这个类不在 JDK 标准库中。
为什么 ExceptionUtils 不能直接用
Java 原生没有 ExceptionUtils 类。它属于 org.apache.commons:commons-lang3,必须显式添加依赖:
org.apache.commons commons-lang3 3.14.0
- 用 Maven 时漏掉依赖会报
ClassNotFoundException: org.apache.commons.lang3.exception.ExceptionUtils - IntelliJ 或 Eclipse 中即使写了 import,也会标红,因为类根本不存在于 classpath
- 注意包名是
org.apache.commons.lang3.exception.ExceptionUtils,不是lang或lang2
ExceptionUtils.getStackTrace() 的实际用法
它接受 Throwable 子类(Exception、Error、RuntimeException 都行),返回一个含换行符的 String,内容和 e.printStackTrace() 输出一致,但不打印到控制台,便于记录或传输:
try {
throw new IllegalArgumentException("参数错误");
} catch (Exception e) {
String stackTrace = ExceptionUtils.getStackTrace(e);
log.error("捕获异常:{}", stackTrace); // 注意这里传的是字符串,不是 e
}
- 不要传
e.toString()或e.getMessage()给它——它只认Throwable - 返回值已包含换行,写入日志文件时无需额外加
\n - 如果只想要“第一行”(即异常类型 + 消息),用
e.toString()更轻量;getStackTrace()是全量,开销略大
替代方案:不用 Commons Lang 怎么办
如果项目不允许引入第三方依赖,可用 JDK 原生方式构造类似效果:
立即学习“Java免费学习笔记(深入)”;
public static String getStackTraceAsString(Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
- 这段代码行为和
ExceptionUtils.getStackTrace()几乎一致 - 但要注意:每次调用都新建
StringWriter和PrintWriter,短生命周期无妨,高频调用(如每毫秒一次)可能触发 GC - 别忘了在
catch块里处理null:如果t == null,printStackTrace()会 NPE
真正容易被忽略的是:堆栈信息本身不包含线程名、时间戳、上下文变量——这些得靠日志框架(如 Logback 的 %ex 或 %throwable)或手动拼接。单纯靠 getStackTrace() 拿到的只是纯文本快照。










