Java 将堆栈跟踪转换为字符串

410 阅读2分钟
原文链接: www.ripjava.com

Java 将堆栈跟踪转换为字符串

1 简介

在处理Java中的异常时,我们经常需要记录或只显示堆栈跟踪。

但是,有时候,我们不希望只打印堆栈跟踪,我们可能需要将堆栈跟踪写入文件,数据库甚至通过网络传输。

出于这些目的,将堆栈跟踪作为String将非常有用。

不幸的是,Java并没有提供一种非常方便的方法来直接实现这一点。

2.使用Java SE API进行转换

让我们Java SE API开始。

Exception类的printStackTrace()方法可以接受一个PrintStreamPrintWriter的参数,

因此,我们可以使用StringWriter将堆栈跟踪打印到String中

    @Test
    public void test_StackTraceToStringByStringWriter(){
        try {
            throw new NullPointerException();
        } catch (Exception e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);

            System.out.println(sw.toString());
        }
    }

然后,调用sw.toString()将返回包含堆栈跟踪信息的String了。

3. 使用Commons-Lang的工具类进行转换

虽然前面的方法是使用核心Java 将堆栈跟踪转换为String的最简单方法,但它仍然有点麻烦。

幸运的是,Apache Commons-Lang提供了一个完成这项工作的功能。

Apache Commons-Lang是一个非常有用的库,它提供了许多Java API核心类中缺少的功能,包括可用于处理异常的类。

首先,让我们从项目配置开始。使用Maven时,我们只需要将以下依赖项添加到pom.xml

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

然后,使用ExceptionUtils工具类从Exception中将堆栈跟踪作为String

    @Test
    public void test_StackTraceToStringByExceptionUtils(){
        try {
            throw new IndexOutOfBoundsException();
        } catch (Exception e) {
            System.out.println(ExceptionUtils.getStackTrace(e));
        }
    }

4. 结论

本文介绍了两种方式,将异常的堆栈跟踪转换为String

  • 使用Java SE API
  • 使用Apache Commons-Lang的方法。

但是,Java 9带来一个新的StackWalking API,它可以使事情变得更容易。这个以后会专门写一篇文章和大家分享。