Java打印异常堆栈信息,定位异常调用位置 |
您所在的位置:网站首页 › eclipse控制台输出行数 › Java打印异常堆栈信息,定位异常调用位置 |
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 |