文档章节

Java:打印异常信息与调用堆栈到控制台

北风其凉
 北风其凉
发布于 2016/05/13 18:25
字数 554
阅读 765
收藏 8

Java语言的异常类Exception包含着异常的全部信息。

现设异常的实例名为ex,所有的异常都是一个除以0的表达式(int i = 1 / 0)所触发的:

1、通过ex.getMessage()可以获取异常信息,如

/ by zero

2、通过ex.toString()可以获取异常类型和异常信息,如

java.lang.ArithmeticException: / by zero

3、通过ex.printStackTrace()可以直接在控制台打印异常的全部信息(包括堆栈),但该函数最好不要直接调用无参数的版本,因为这样会让控制台显示出现错乱。调用printStackTrace时,通过如下方法调用:

StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
ex.printStackTrace(printWriter);
System.out.println(stringWriter.toString());

使用此方法,控制台输出的内容为:

java.lang.ArithmeticException: / by zero
	at ExceptionTest.exec3(ExceptionTest.java:31)
	at ExceptionTest.exec2(ExceptionTest.java:23)
	at ExceptionTest.exec1(ExceptionTest.java:15)
	at ExceptionTest.main(ExceptionTest.java:39)

如果使用的是Eclipse的控制台,异常类名和指明行数的错误堆栈都会生成相应的跳转链接。

4、通过ex.getStackTrace()可以获取堆栈信息,这是 ex.printStackTrace() 外的另一种获取异常堆栈信息的方法。通过此方法可以定制化输出堆栈信息。

System.out.println(ex.getClass().getName() + ": " + ex.getMessage());
StringBuilder sbException = new StringBuilder();
for (StackTraceElement ele : ex.getStackTrace()) {
    sbException.append(MessageFormat.format("\tat {0}.{1}({2}:{3})\n", 
        ele.getClassName(), ele.getMethodName(), ele.getFileName(), ele.getLineNumber()));;
}
System.out.println(sbException);

打印出的异常堆栈为:

java.lang.ArithmeticException: / by zero
	at ExceptionTest.exec3(ExceptionTest.java:31)
	at ExceptionTest.exec2(ExceptionTest.java:23)
	at ExceptionTest.exec1(ExceptionTest.java:15)
	at ExceptionTest.main(ExceptionTest.java:39)

最后列一下完整的Java代码:

import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.MessageFormat;

/**
 * 异常打印测试
 * @文件名称 ExceptionTest.java
 * @文件作者 Tsybius2014
 * @创建时间 2016年5月13日 下午6:14:08
 */
public class ExceptionTest {
    /** 第一层函数 */
    public static void exec1() {
        try {
            exec2();
        } catch (Exception ex) {
            throw ex;
        }
    }
    /** 第二层函数 */
    public static void exec2() {
        try {
            exec3();
        } catch (Exception ex) {
            throw ex;
        }
    }
    /** 第三层函数 */
    public static void exec3() {
        try {
            int i = 1 / 0;
        } catch (Exception ex) {
            throw ex;
        }
    }
    /** 主函数 */
    public static void main(String[] args) {
        try {
            exec1();
        } catch (Exception ex) {
            System.out.println("--- getMessage ---");
            System.out.println(ex.getMessage());
            System.out.println();
            System.out.println("--- toString ---");
            System.out.println(ex.toString());
            System.out.println();
            System.out.println("--- printStackTrace ---");
            StringWriter stringWriter = new StringWriter();
            PrintWriter printWriter = new PrintWriter(stringWriter);
            ex.printStackTrace(printWriter);
            System.out.println(stringWriter.toString());
            System.out.println();
            System.out.println("--- printStackTrace DIY ---");
            System.out.println(ex.getClass().getName() + ": " + ex.getMessage());
            StringBuilder sbException = new StringBuilder();
            for (StackTraceElement ele : ex.getStackTrace()) {
                sbException.append(MessageFormat.format("\tat {0}.{1}({2}:{3})\n", 
                    ele.getClassName(), ele.getMethodName(), ele.getFileName(), ele.getLineNumber()));;
            }
            System.out.println(sbException);
        }
    }
}

控制台输出结果如下:

END

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 116
博文 498
码字总数 463468
作品 4
朝阳
程序员
私信 提问
Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
2018/10/20
0
0
谈谈我对Exception和Error的理解(未完)

NoClassDefFoundError/ClassNotFoundException NoClassDefFoundError发生在jvm运行时,执行某个方法或者静态成员时,如果jvm加载不到该类时报错的错误。本地编译没报错,但运行时报错,有可能...

classfly
2018/06/11
0
0
关于编写Java程序让Jvm崩溃

  今天在书上看到一个作者提出一个问题"怎样通过编写Java代码让Jvm崩溃",我看了之后也不懂。带着问题查了一下,百度知道里面有这样一个答案:   1 package jvm;   2   3 public clas...

thinkyoung
2014/11/01
0
0
记一次异常排查过程:druid连接池抛出DataSourceDisableException

先交待下项目背景,项目中有个功能是从mysql中获取数据库信息来创建数据库连接,用的连接池是druid,jar包版本是1.0.9。 1. 异常的发生 最近项目中出现了一个神奇的异常: 读取MySQL数据错误...

Funcy1122
2018/08/23
0
0
线上Java应用排查和诊断规范

@郑昀 整理 标准做法一:OOM触发HeadpDump 目的: OOM发生时,输出堆栈快照文件,供研发人员分析。 在JVM中,如果98%的时间是用于 GC 且可用的 Heap size 不足2%的时候,将抛出 OOM 异常。...

旁观者-郑昀
2013/09/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Git代码防丢指南

我们在日常使用Git的过程中经常会发生一些意外情况,如果处理不当,则可能会出现代码丢失的假象。本文将针对IDEA&Git日常开发中的一些场景,为你层层拨开迷雾,解析常见的错误及其发生原因,...

joymufeng
5分钟前
0
0
传统IDC部署网站(三)

16. chown命令 chown 用来更改一个文件或者目录的所有者护着所属组 -R 级联更改一个目录下所有的目录和文件 chown user1:users 1.txtchown user1.users 1.tx useradd 添加用户的命令 user...

miko0089
16分钟前
0
0
来玩一下Java设计模式之命令模式

wiki上的描述 Encapsulate a request as an object, thereby allowing for the parameterization of clients with different requests, and the queuing or logging of requests. It also al......

小刀爱编程
17分钟前
0
0
Optional类的简单了解

import java.util.Optional;/** * @author hanliwei */public class OptionalTest { /** * Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返...

wind2012
25分钟前
0
0
如何写出好的单元测试?

大家都知道,开发软件的时候为代码编写单元测试是很好的。但实际上,光有测试还不够,还要编写好的测试,这同样重要。 要做到这一点,考虑遵循一些固执的原则,对测试代码给予一些关爱: 1....

程序猿拿Q
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部