浅谈java异常链与异常丢失
1、在java的构造方法中提供了异常链..也就是我们可以通过构造方法不断的将异常串联成一个异常链...
之所以需要异常连,是因为处于代码的可理解性,以及阅读和程序的可维护性...
我们知道我们每抛出一个异常都需要进行trycatch...那么岂不是代码很臃肿...
我们如果可以将异常串联成一个异常连,然后我们只捕获我们的包装异常,我们知道RuntimeException以及其派生类可以不进行trycatch而被jvm自动捕获并处理..
当然了我们可以自己定义自己的异常类从RuntimeException中派生,然后通过一级一级的包装,假如异常出现了JWM通过我们的自定义RuntimeException直接输出cause
(原因)也就是我们的异常链..因此我们的所有异常也就输出了,这样就减少了很多的异常处理的代码。。。
只有Throwable---->Exception RuntimeException Error提供了构造方法实现异常链的机制。。。其他异常需要通过initCause来
构造异常连..
下面一段代码就是异常连的一个简单示例...可以打印整个程序过程中出现的异常。。
publicclassTestT{
publicstaticvoida()throwsException{//抛出异常给上级处理
try{
b();
}catch(Exceptione){
thrownewException(e);
}
}
publicstaticvoidb()throwsException{//抛出异常给上级处理
try{
c();
}catch(Exceptione){
thrownewException(e);
}
}
publicstaticvoidc()throwsException{//抛出异常给上级处理
try{
thrownewNullPointerException("c异常链中的空指针异常..");
}catch(NullPointerExceptione){
thrownewException(e);
}
}
publicstaticvoidmain(String[]args){
try{
a();
}catch(Exceptione){
e.printStackTrace();
}
}
}
2、trycatch...finally 有个漏洞就是异常缺失.. 例如三个trycatch 嵌套在一起..内部的2个trycatch就可以省略catch....直接tryfinally..
看下面代码 我们发现丢失了2个异常信息
publicclassMyTest{
publicvoidopen()throwsException{
thrownewException(){
publicStringtoString(){
returnthis.getClass().getName()+"CeryImmportException";
};
};
}
publicvoidclose()throwsException{
thrownewException(){
publicStringtoString(){
returnthis.getClass().getName()+"closeException";
};
};
}
publicvoidthree()throwsException{
thrownewException(){
publicStringtoString(){
returnthis.getClass().getName()+"three";
};
};
}
publicstaticvoidmain(String[]agrs){
MyTestmt=newMyTest();
try{
try{
try{
mt.open();
}finally
{
System.out.println("deleteopen");
mt.close();
}
}
finally{
System.out.println("deleteclose");
mt.three();
}
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
以上这篇浅谈java异常链与异常丢失就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。