文档章节

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

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

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

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

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

蔡小鹏
10/20
0
0
记一次异常排查过程:druid连接池抛出DataSourceDisableException

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

Funcy1122
08/23
0
0
谈谈我对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
使用Java实现面向对象编程——第五章 异常

1、 尝试通过if-else来解决异常问题: Eg: public class Test2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); … System.out.print("请输入除数:"); ......

逆風〠飛翔
08/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java.util.Concurrent.Semaphore 源码

类图 源码: package java.util.concurrent;import java.util.Collection;import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class Semaphore implements ja......

狼王黄师傅
18分钟前
2
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
2
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
1
0
使用 React 和 Vue 创建相同的应用,他们有什么差异?

在工作中应用 Vue 之后,我对它有了相当深刻的理解。 不过,俗话说「外国的月亮比较圆」,我好奇「外国的」 React 是怎么样的。 我阅读了 React 文档并观看了一些教程视频,虽然它们很棒,但...

阿K1225
昨天
4
0
2天闭门培训|以太坊智能合约从入门到实战(北京)

2天培训 16个课时 探寻技术原理,精通以太坊智能合约开发 以太坊智能合约是现在应用的最广泛的区块链应用开发方式,HiBlock区块链社区针对以太坊智能合约的学习特别推出2天闭门研修班,通过2...

HiBlock
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部