文档章节

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

北风其凉
 北风其凉
发布于 2016/05/13 18:25
字数 554
阅读 716
收藏 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

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 114
博文 498
码字总数 463468
作品 4
朝阳
程序员
谈谈我对Exception和Error的理解(未完)

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

classfly
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
08/23
0
0
线上Java应用排查和诊断规范

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

旁观者-郑昀
2013/09/26
0
0
慎用异常(Exception)

异常对性能不利。 1.抛出异常首先要创建一个新的对象。 2.Throwable接口的构造函数调用名为fillInStackTrace()的Native方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常...

阿阮
2015/06/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VSCode 搭建Vue开发环境之Vue CLI

一、简介说明 1.关于VS Code开发工具,安装和配置,更多可以参考以前文章 2.关于Vue.js,Vue是一个优秀的渐进式前端框架,不仅易于上手,还便于与第三方库或既有项目整合。 3.关于Vue是使用方...

tianma3798
22分钟前
2
0
MySQL 相关博客整理

1. 《深入理解 MySQL 底层实现》 简评:文章从硬盘底层存储原理讲解到MySQL存储原理,其中涉及InnoDB 和 Myisam 中 B+Tree 的应用,以及常见数据库优化思路,算是一片很不错的讲解MySQL原理的...

科陆李明
32分钟前
2
0
pada rabbitmq server mangage

查看配置文件 ubuntu@node4:/etc/rabbitmq$ lltotal 28drwxr-xr-x 2 rabbitmq rabbitmq 4096 Jun 6 13:52 ./drwxr-xr-x 104 root root 12288 Sep 26 11:39 ../-rw-r--r-- ......

qwfys
39分钟前
0
0
SpringBoot进阶

慕课网链接 表单数据的验证 在pojo类属性的上面添加注解 @Entitypublic class Girl { @Id @GeneratedValue private Integer id; @NotBlank(message = "这个字段...

踏破铁鞋无觅处
47分钟前
1
0
【SylixOS】QT-QWS流程介绍

QWS简介 QWS(QT Windows System)是QT自行开发的窗口系统,体系结构类似X Windows的C/S结构。QWS Server在物理设备上显示,QWS Client实现界面,两者通过socket进行彼此的通讯。在很多嵌入式系...

suokin
47分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部