JAVA栈异常_Java中的异常栈轨迹和异常链

Java中允许对异常进行再次抛出,以提交给上一层进行处理,最为明显的例子为Java的常规异常。

常规异常:有Java所定义的异常,不需要异常声明,在未被try-catch的情况下,会被默认上报到main()方法。

Example:

public class TestException {

TestException(int i) throws ExceptionA,ExceptionB{

int a[]={0,}; a[1]=1;

}

}

当从main()方法中调用TestException类的构造函数的时候,会得到以下的异常提示,从中可以看出异常的冒泡机制(这是一个栈信息)。

e940a657f27237893bf1c03a31dc83d4.png

异常的冒泡上传机制:当一个异常对象产生了以后,其会按照调用层次(一般是方法的调用层次)进行冒泡,直到被try-catch处理,或上报至main()方法,有编译器进行提示。

Example:

4faf739ae285feb990c397b4f843e0e9.png

firstThrow()提示错误的原因为, firstThrow()的函数声明中包括了MyException的异常声明,而secondThrow()中调用了firstThrow()却未对可能抛出的异常对象提供任何处理方案,这是编译器所不能允许发生的事情。(这也是为了保证底层异常对象在冒泡过程中,能得到合适的处理和重视!)

注意此截图中,MyEclipse提供了两种方式帮助fix这个程序,这两种方式常用的异常应对手段:

1、本方法不给予处理,将异常上报给上一层。

1 public classTestExceptionChain {2 void firstThrow() throwsMyException3 {4 print("Oringinally creat a MyException and throw it out");5 throw newMyException();6

7 }8 void secondThrow() throwsMyException9 {10 firstThrow();11 }12 TestExceptionChain() throwsMyException{13 secondThrow();14 }15 }

1 public static voidmain(String[] args) {2 try{3

4 TestExceptionChain testExceptionChain=newTestExceptionChain();5 }6 catch(MyException e)7 {8 e.printStackTrace();9 print("Catch a my exception!");10 }11

12 }

控制台的输出为:

70d81b5a72bbfb6fe74d35e88d2b6513.png

从异常栈的记录信息可以发现,与代码相对应的异常抛出机制和次序:

firstThrow()产生MyException对象->异常冒泡至调用其的secondThrow()->异常冒泡至调用secondThrow()的TestExceptionChain的构造方法->冒泡至printtry的main()方法。

注意到:异常对象一直被抛出,直至在printtry的mian()方法中被try-catch捕获!

2、try-catch方式,捕捉上报的异常,而后进行相应处理或抛出另一异常。

2、1捕获异常后,进行相应处理。

Example:

1 public classTestExceptionChain {2 void firstThrow() throwsMyException3 {4 print("Oringinally creat a MyException and throw it out");5 throw newMyException();6 }7 voidsecondThrow()8 {9 try

10 {11 firstThrow();12 }13 catch(MyException e)14 {15 print("I have just caught a MyExcepton,but i want to do nothing for it");16 e.printStackTrace();17 }18 }19 TestExceptionChain(){20 secondThrow();21 }

0e6ac8f3bae803984b0196e51335f0ee.png

从图中可以发现,异常在secondThrow() 中被try-catch模块捕获,并执行了相应的处理操作,所以其函数声明中无需添加异常声明,异常不会被上报。

故mian()方法被改写成了以下的代码:

1 TestExceptionChain testExceptionChain=new TestExceptionChain();

注意此处异常栈的信息,表示的是异常产生的层次信息,并非异常信息的上报层次,因为其已经在secondThorow()中被捕获处理。

2.2 捕获异常后,抛出另一个异常。

Example:

1 public classTestExceptionChain {2 void firstThrow() throwsMyException3 {4 print("Oringinally creat a MyException and throw it out");5 throw newMyException();6 }7 void secondThrow() throwsYouException8 {9 try

10 {11 firstThrow();12 }13 catch(MyException e)14 {15 print("I have just caught a MyExcepton,but i want to create a YouException and throw it out");16 e.printStackTrace();17 throw newYouException();18 }19 }20 TestExceptionChain() throwsYouException{21 secondThrow();22 }23 }24 class MyException extendsException{}25 class YouException extends Exception{}

50c1a41cea221a43a93dc90cf2d0ec50.png

从异常栈信息中可以发现,新抛出的YouException对象是从secondThrow()中开始的。

*Java中还提供了fillInStackTrace()方法,用于对捕获的异常的栈信息进行重写。

Example:

1 try{2

3 TestExceptionChain testExceptionChain=newTestExceptionChain();4 }5 catch(YouException e)6 {7 print("Catch a YouException!");8 e.fillInStackTrace();9 e.printStackTrace();10

11 }

1dc30b26633c66f32ad02a71e9c51d86.png

由于使用了fillInstack()方法,关于YouException的异常信息被重写,从其被从写处重新记录!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值