Java异常的栈轨迹(Stack Trace)

上传人:野鹰 文档编号:3037559 上传时间:2017-07-30 格式:DOC 页数:4 大小:45KB
返回 下载 相关 举报
Java异常的栈轨迹(Stack Trace)_第1页
第1页 / 共4页
Java异常的栈轨迹(Stack Trace)_第2页
第2页 / 共4页
Java异常的栈轨迹(Stack Trace)_第3页
第3页 / 共4页
Java异常的栈轨迹(Stack Trace)_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《Java异常的栈轨迹(Stack Trace)》由会员分享,可在线阅读,更多相关《Java异常的栈轨迹(Stack Trace)(4页珍藏版)》请在金锄头文库上搜索。

1、cucci 女包、香奈儿包包 、爱马仕包包:|冬装外套、冬装女装、时尚冬装:gucci 包、酷奇包包、金利来女包:|皮草外套、水貂皮草、皮草大衣: www.qqxk.orgJava 异常的栈轨迹(Stack Trace)捕获到异常时,往往需要进行一些处理。比较简单直接的方式就是打印异常栈轨迹Stack Trace。说起栈轨迹,可能很多人和我一样,第一反应就是 printStackTrace()方法。其实除了这个方法,还有一些别的内容也是和栈轨迹有关的。1.printStackTrace()首先需要明确,这个方法并不是来自于 Exception 类。Exception 类本身除了定义了几个构造器

2、之外,所有的方法都是从其父类继承过来的。而和异常相关的方法都是从java.lang.Throwable 类继承过来的。而 printStackTrace()就是其中一个。这个方法会将 Throwable 对象的栈轨迹信息打印到标准错误输出流上。输出的大体样子如下:java.lang.NullPointerExceptionat MyClass.mash(MyClass.java:9)at MyClass.crunch(MyClass.java:6)at MyClass.main(MyClass.java:3)输出的第一行是 toString()方法的输出,后面几行的内容都是之前通过 fillI

3、nStackTrace()方法保存的内容。关于这个方法,我们后面会讲。下面看一个例子:public class TestPrintStackTrace public static void f() throws Exceptionthrow new Exception(出问题啦!);public static void g() throws Exceptionf();public static void main(String args) try g();catch(Exception e) e.printStackTrace();这个例子的输出如下:java.lang.Exception:

4、出问题啦!at TestPrintStackTrace.f(TestPrintStackTrace.java:3)at TestPrintStackTrace.g(TestPrintStackTrace.java:6)at TestPrintStackTrace.main(TestPrintStackTrace.java:10)在这个例子中,在方法 f()中抛出异常,方法 g()中调用方法 f(),在 main 方法中捕获异常,并且打印栈轨迹信息。因此,输出依次展示了 fgmain 的过程。2.getStackTrace()方法这个方法提供了对 printStackTrace()方法所打印信息

5、的编程访问。它会返回一个栈轨迹元素的数组。以上面的输出为例,输出的第 2-4 行每一行的内容对应一个栈轨迹元素。将这些cucci 女包、香奈儿包包 、爱马仕包包:|冬装外套、冬装女装、时尚冬装:gucci 包、酷奇包包、金利来女包:|皮草外套、水貂皮草、皮草大衣: www.qqxk.org栈轨迹元素保存在一个数组中。每个元素对应栈的一个栈帧。数组的第一个元素保存的是栈顶元素,也就是上面的 f。最后一个元素保存的栈底元素。下面是一个使用 getStackTrace()访问这些轨迹栈元素并打印输出的例子:public class TestPrintStackTrace public static

6、void f() throws Exceptionthrow new Exception(出问题啦!);public static void g() throws Exceptionf();public static void main(String args) try g();catch(Exception e) e.printStackTrace();System.out.println(-);for(StackTraceElement elem : e.getStackTrace() System.out.println(elem);这样的输出和 printStackTrace()的输出

7、基本上是一样的,如下:java.lang.Exception: 出问题啦!at TestPrintStackTrace.f(TestPrintStackTrace.java:3)at TestPrintStackTrace.g(TestPrintStackTrace.java:6)at TestPrintStackTrace.main(TestPrintStackTrace.java:10)TestPrintStackTrace.f(TestPrintStackTrace.java:3)TestPrintStackTrace.g(TestPrintStackTrace.java:6)TestP

8、rintStackTrace.main(TestPrintStackTrace.java:10)3.fillInStackTrace()我们在前面也提到了这个方法。要说清楚这个方法,首先要讲一下捕获异常之后重新抛出的问题。在 catch 代码块中捕获到异常,打印栈轨迹,又重新 throw 出去。在上一级的方法调用中,再捕获这个异常并且打印出栈轨迹信息。这两个栈轨迹信息会一样吗?我们看一下代码:public class TestPrintStackTrace public static void f() throws Exceptionthrow new Exception(出问题啦!);cuc

9、ci 女包、香奈儿包包 、爱马仕包包:|冬装外套、冬装女装、时尚冬装:gucci 包、酷奇包包、金利来女包:|皮草外套、水貂皮草、皮草大衣: www.qqxk.orgpublic static void g() throws Exceptiontry f();catch(Exception e) e.printStackTrace();throw e;public static void main(String args) try g();catch(Exception e) e.printStackTrace();在 main 方法中捕获的异常,是在 g()方法中抛出的,按理说这两个打印栈轨

10、迹的信息应该不同,第二次打印的信息应该没有关于 f 的信息。但是事实上,两次打印栈轨迹信息是一样的。输出结果如下:java.lang.Exception: 出问题啦!at TestPrintStackTrace.f(TestPrintStackTrace.java:3)at TestPrintStackTrace.g(TestPrintStackTrace.java:7)at TestPrintStackTrace.main(TestPrintStackTrace.java:16)java.lang.Exception: 出问题啦!at TestPrintStackTrace.f(TestPr

11、intStackTrace.java:3)at TestPrintStackTrace.g(TestPrintStackTrace.java:7)at TestPrintStackTrace.main(TestPrintStackTrace.java:16)也就是说,捕获到异常又立即抛出,在上级方法调用中再次捕获这个异常,打印的栈轨迹信息是一样的。原因在于没有将当前线程当前状态下的轨迹栈的状态保存进 Throwabe 中。现在我们引入 fillInStackTrace()方法。这个方法刚好做的就是这样的保存工作。我们看一下这个方法的原型:public Throwable fillInStack

12、Trace()这个方法是有返回值的。返回的是保存了当前栈轨迹信息的 Throwable 对象。我们看看使用 fillInStackTrace()方法处理后,打印的栈轨迹信息有什么不同,代码如下:public class TestPrintStackTrace public static void f() throws Exceptionthrow new Exception(出问题啦!);public static void g() throws Exceptioncucci 女包、香奈儿包包 、爱马仕包包:|冬装外套、冬装女装、时尚冬装:gucci 包、酷奇包包、金利来女包:|皮草外套、水貂

13、皮草、皮草大衣: www.qqxk.orgtry f();catch(Exception e) e.printStackTrace();/不要忘了强制类型转换throw (Exception)e.fillInStackTrace();public static void main(String args) try g();catch(Exception e) e.printStackTrace();输出如下:java.lang.Exception: 出问题啦!at TestPrintStackTrace.f(TestPrintStackTrace.java:3)at TestPrintStackTrace.g(TestPrintStackTrace.java:7)at TestPrintStackTrace.main(TestPrintStackTrace.java:17)java.lang.Exception: 出问题啦!at TestPrintStackTrace.g(TestPrintStackTrace.java:11)at TestPrintStackTrace.main(TestPrintStackTrace.java:17)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号