Java打印异常堆栈信息,定位异常调用位置

您所在的位置:网站首页 eclipse控制台输出行数 Java打印异常堆栈信息,定位异常调用位置

Java打印异常堆栈信息,定位异常调用位置

2023-08-08 05:47| 来源: 网络整理| 查看: 265

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);         }     } }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3