Java中catch函数_关于java中的try和catch
关键字及其中语句流程详解
3.1try的嵌套
你可以在⼀个成员函数调⽤的外⾯写⼀个try语句,在这个成员函数内部,写另⼀个try语句保护其他代码。每当遇到⼀个try语句,异常的框
架就放到堆栈上⾯,直到所有的try语句都完成。如果下⼀级的try语句没有对某种异常进⾏处理,堆栈就会展开,直到遇到有处理这种异常
的try语句。下⾯是⼀个try语句嵌套的例⼦。
classMultiNest{
staticvoidprocedure(){
try{
inta=0;
intb=42/a;
}catch(eticExceptione){
n("inprocedure,catchArithmeticException:"+e);
}
}
publicstaticvoidmain(Stringargs[]){
try{
procedure();
}catch(ione){
n("inmain,catchException:"+e);
}
}
}
这个例⼦执⾏的结果为:
inprocedure,catchArithmeticException:eticException:/byzero
成员函数procedure⾥有⾃⼰的try/catch控制,所以main不⽤去处理ArrayIndexOutOfBoundsException;当然如果如同最开始我们
做测试的例⼦⼀样,在procedure中catch到异常时使⽤throwe;语句将异常抛出,那么main当然还是能够捕捉并处理这个procedure抛出
来的异常。例如在procedure函数的catch中的语句后⾯增加throwe;语句之后,执⾏结果就变为:
inprocedure,catchArithmeticException:eticException:/byzero
inmain,catchException:eticException:/byzero
3.2try-catch程序块的执⾏流程以及执⾏结果
相对于try-catch-finally程序块⽽⾔,try-catch的执⾏流程以及执⾏结果还是⽐较简单的。
⾸先执⾏的是try语句块中的语句,这时可能会有以下三种情况:
1.如果try块中所有语句正常执⾏完毕,那么就不会有其他的“动做”被执⾏,整个try-catch程序块正常完成。
2.如果try语句块在执⾏过程中碰到异常V,这时⼜分为两种情况进⾏处理:
-->如果异常V能够被与try相应的catch块catch到,那么第⼀个catch到这个异常的catch块(也是离try最近的⼀个与异常V匹配的catch块)
将被执⾏;如果catch块执⾏正常,那么try-catch程序块的结果就是“正常完成”;如果该catch块由于原因R突然中⽌,那么try-catch程
序块的结果就是“由于原因R突然中⽌(completesabruptly)”。
-->如果异常V没有catch块与之匹配,那么这个try-catch程序块的结果就是“由于抛出异常V⽽突然中⽌(completesabruptly)”。
3.如果try由于其他原因R突然中⽌(completesabruptly),那么这个try-catch程序块的结果就是“由于原因R突然中⽌(completes
abruptly)”。
3.3try-catch-finally程序块的执⾏流程以及执⾏结果
try-catch-finally程序块的执⾏流程以及执⾏结果⽐较复杂。
⾸先执⾏的是try语句块中的语句,这时可能会有以下三种情况:
1.如果try块中所有语句正常执⾏完毕,那么finally块的居于就会被执⾏,这时分为以下两种情况:
-->如果finally块执⾏顺利,那么整个try-catch-finally程序块正常完成。
-->如果finally块由于原因R突然中⽌,那么try-catch-finally程序块的结局是“由于原因R突然中⽌(completesabruptly)”
2.如果try语句块在执⾏过程中碰到异常V,这时⼜分为两种情况进⾏处理:
-->如果异常V能够被与try相应的catch块catch到,那么第⼀个catch到这个异常的catch块(也是离try最近的⼀个与异常V匹配的catch块)
将被执⾏;这时就会有两种执⾏结果:
-->如果catch块执⾏正常,那么finally块将会被执⾏,这时分为两种情况:
-->如果finally块执⾏顺利,那么整个try-catch-finally程序块正常完成。
-->如果finally块由于原因R突然中⽌,那么try-catch-finally程序块的结局是“由于原因R突然中⽌(completesabruptly)”
-->如果catch块由于原因R突然中⽌,那么finally模块将被执⾏,分为两种情况:
-->如果如果finally块执⾏顺利,那么整个try-catch-finally程序块的结局是“由于原因R突然中⽌(completesabruptly)”。
-->如果finally块由于原因S突然中⽌,那么整个try-catch-finally程序块的结局是“由于原因S突然中⽌(completesabruptly)”,原因R将
被抛弃。
(注意,这⾥就正好和我们的例⼦相符合,虽然我们在testEx2中使⽤throwe抛出了异常,但是由于testEx2中有finally块,⽽finally块的
执⾏结果是completeabruptly的(别⼩看这个⽤得最多的return,它也是⼀种导致completeabruptly的原因之⼀啊——后⽂中有关于导致
completeabruptly的原因分析),所以整个try-catch-finally程序块的结果是“completeabruptly”,所以在testEx1中调⽤testEx2时
是捕捉不到testEx1中抛出的那个异常的,⽽只能将finally中的return结果获取到。
如果在你的代码中期望通过捕捉被调⽤的下级函数的异常来给定返回值,那么⼀定要注意你所调⽤的下级函数中的finally语句,它有可能会
使你throw出来的异常并不能真正被上级调⽤函数可见的。当然这种情况是可以避免的,以testEx2为例:如果你⼀定要使⽤finally⽽且⼜
要将catch中throw的e在testEx1中被捕获到,那么你去掉testEx2中的finally中的return就可以了。
这个事情已经在OMC2.0的MIB中出现过啦:服务器的异常不能完全被反馈到客户端。)
-->如果异常V没有catch块与之匹配,那么finally模块将被执⾏,分为两种情况:
-->如果finally块执⾏顺利,那么整个try-catch-finally程序块的结局就是“由于抛出异常V⽽突然中⽌(completesabruptly)”。
-->如果finally块由于原因S突然中⽌,那么整个try-catch-finally程序块的结局是“由于原因S突然中⽌(completesabruptly)”,异常V将
被抛弃。
3.如果try由于其他原因R突然中⽌(completesabruptly),那么finally块被执⾏,分为两种情况:
-->如果finally块执⾏顺利,那么整个try-catch-finally程序块的结局是“由于原因R突然中⽌(completesabruptly)”。
-->如果finally块由于原因S突然中⽌,那么整个try-catch-finally程序块的结局是“由于原因S突然中⽌(completesabruptly)”,原因R将
被抛弃。
3.4try-catch-finally程序块中的return
从上⾯的try-catch-finally程序块的执⾏流程以及执⾏结果⼀节中可以看出⽆论try或catch中发⽣了什么情况,finally都是会被执⾏的,那
么写在try或者catch中的return语句也就不会真正的从该函数中跳出了,它的作⽤在这种情况下就变成了将控制权(语句流程)转到finally块
中;这种情况下⼀定要注意返回值的处理。
例如,在try或者catch中returnfal了,⽽在finally中⼜returntrue,那么这种情况下不要期待你的try或者catch中的returnfal的返
回值fal被上级调⽤函数获取到,上级调⽤函数能够获取到的只是finally中的返回值,因为try或者catch中的return语句只是转移控制权
的作⽤。
3.5如何抛出异常
如果你知道你写的某个函数有可能抛出异常,⽽你⼜不想在这个函数中对异常进⾏处理,只是想把它抛出去让调⽤这个函数的上级调⽤函数
进⾏处理,那么有两种⽅式可供选择:
第⼀种⽅式:直接在函数头中throwsSomeException,函数体中不需要try/catch。⽐如将最开始的例⼦中的testEx2改为下⾯的⽅式,
那么testEx1就能捕捉到testEx2抛出的异常了。
booleantestEx2()throwsException{
booleanret=true;
intb=12;
intc;
for(inti=2;i>=-2;i--){
c=b/i;
n("i="+i);
}
returntrue;
}
第⼆种⽅式:使⽤try/catch,在catch中进⾏⼀定的处理之后(如果有必要的话)抛出某种异常。例如上⾯的testEx2改为下⾯的⽅
式,testEx1也能捕获到它抛出的异常:
booleantestEx2()throwsException{
booleanret=true;
try{
intb=12;
intc;
for(inti=2;i>=-2;i--){
c=b/i;
n("i="+i);
}
returntrue;
}catch(Exceptione){
n("testEx2,catchexception");
Throwe;
}
}
第三种⽅法:使⽤try/catch/finally,在catch中进⾏⼀定的处理之后(如果有必要的话)抛出某种异常。例如上⾯的testEx2改为下⾯的⽅
式,testEx1也能捕获到它抛出的异常:
booleantestEx2()throwsException{
booleanret=true;
try{
intb=12;
intc;
for(inti=2;i>=-2;i--){
c=b/i;
n("i="+i);
thrownewException("aaa");
}
returntrue;
}catch(eticExceptione){
n("testEx2,catchexception");
ret=fal;
thrownewException("aaa");
}finally{
n("testEx2,finally;returnvalue="+ret);
}
}
本文发布于:2022-12-30 23:09:18,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/62217.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |