引子
try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。
try-catch程序块的执行流程以及执行结果
相对于try-catch-finally程序块而言,try-catch的执行流程以及执行结果还是比较简单的。
首先执行的是try语句块中的语句,这时可能会有以下三种情况:
1. 如果try块中所有语句正常执行完毕,那么就不会有其他的“动做”被执行,整个try-catch程序块正常完成。
2. 如果try语句块在执行过程中碰到异常V,这时又分为两种情况进行处理:
1>如果异常V能够被与try相应的catch块catch到,那么第一个catch到这个异常的catch块(也是离 try最近的一个与异常V匹配的catch块)将被执行;如果catch块执行正常,那么try-catch程序块的结果就是“正常完成”;如果该 catch块由于原因R突然中止,那么try-catch程序块的结果就是“由于原因R突然中止(completes abruptly)”。
2>如果异常V没有catch块与之匹配,那么这个try-catch程序块的结果就是“由于抛出异常V而突然中止(completes abruptly)”。
3. 如果try由于其他原因R突然中止(completes abruptly),那么这个try-catch程序块的结果就是“由于原因R突然中止(completes abruptly)”。
3.3 try-catch-finally程序块的执行流程以及执行结果
try-catch-finally程序块的执行流程以及执行结果比较复杂。
首先执行的是try语句块中的语句,这时可能会有以下三种情况:
1. 如果try块中所有语句正常执行完毕,那么finally块的居于就会被执行,这时分为以下两种情况:
1>如果finally块执行顺利,那么整个try-catch-finally程序块正常完成。
2>如果finally块由于原因R突然中止,那么try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”
2. 如果try语句块在执行过程中碰到异常V,这时又分为两种情况进行处理:
² 如果异常V能够被与try相应的catch块catch到,那么第一个catch到这个异常的catch块(也是离try最近的一个与异常V匹配的catch块)将被执行;这时就会有两种执行结果:
² 如果catch块执行正常,那么finally块将会被执行,这时分为两种情况:
² 如果finally块执行顺利,那么整个try-catch-finally程序块正常完成。
² 如果finally块由于原因R突然中止,那么try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”
² 如果catch块由于原因R突然中止,那么finally模块将被执行,分为两种情况:
² 如果如果finally块执行顺利,那么整个try-catch-finally程序块的结局是“由于原因R突然中止(completes abruptly)”。
² 如果finally块由于原因S突然中止,那么整个try-catch-finally程序块的结局是“由于原因S突然中止(completes abruptly)”,原因R将被抛弃。
(注意,这里就正好和我们的例子相符合,虽然我们在testEx2中使用throw e抛出了异常,但是由于testEx2中有finally块,而finally块的执行结果是complete abruptly的(别小看这个用得最多的return,它也是一种导致complete abruptly的原因之一啊——后文中有关于导致complete abruptly的原因分析),所以整个try-catch-finally程序块的结果是“complete abruptly”,所以在testEx1中调用testEx2时是捕捉不到testEx1中抛出的那个异常的,而只能将finally中的return 结果获取到。
如果在你的代码中期望通过捕捉被调用的下级函数的异常来给定返回值,那么一定要注意你所调用的下级函数中的finally语句,它有可能会使你throw 出来的异常并不能真正被上级调用函数可见的。当然这种情况是可以避免的,以testEx2为例:如果你一定要使用finally而且又要将catch中 throw的e在testEx1中被捕获到,那么你去掉testEx2中的finally中的return就可以了。
package myExample.testException;
public class TestException {
public TestException() {
}
boolean testEx() throws Exception{
boolean ret = true;
try{
ret = testEx1();
}catch (Exception e){
System.out.println("testEx, catch exception");
ret = false;
throw e;
}finally{
System.out.println("testEx, finally; return value="+ret);
return ret;
}
}
boolean testEx1() throws Exception{
boolean ret = true;
try{
ret = testEx2();
if (!ret){
return false;//try 被中止 转入finally
}
System.out.println("testEx1, at the end of try");
return ret;
}catch (Exception e){
System.out.println("testEx1, catch exception");
ret = false;
throw e;
}finally{
System.out.println("testEx1, finally; return value="+ret);
return ret;//finally 被中止,丢弃try 的原因 结局则是由于"return" 中止
}
}
boolean testEx2() throws Exception{
boolean ret = true;
try{
int b=12;
int c;
for (int i=2;i>=-2;i--){
c=b/i;
System.out.println("i="+i);
}
return true;
}catch (Exception e){
System.out.println("testEx2, catch exception");
ret = false;
throw e;//catch块由于原因R突然中止
}finally{
System.out.println("testEx2, finally; return value="+ret);
return ret;//如果finally块由于原因S(return 是原因之一)突然中止,那么整个try-catch-finally程序块的结局是“由于原因S突然中止(completes abruptly)”,原因R将被抛弃。
}
}
public static void main(String[] args) {
TestException testException1 = new TestException();
try{
testException1.testEx();
}catch(Exception e){
e.printStackTrace();
}
}
}
i=2
i=1
testEx2, catch exception
testEx2, finally; return value=false
testEx1, finally; return value=false
testEx, finally; return value=false
分享到:
相关推荐
14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理机制.zip14.java异常处理...
深入理解java异常处理机制,很详细的,去了,你们的!
异常处理是Java语言的重要机制,正确、合理地处理异常对系统的健壮性和稳定性提供了强有力的支持。异常的处理主要包括捕捉异常、程序流程的跳转和异常处理语句块的定义等。
异常处理机制是面向对象语言普遍支持的提高软件可靠性的方法。作为两款被广泛使用的面向对象语言,C++和Java语言都支持异常处理机制...该算法可以同时支持C++和Java异常处理机制,并有效提高了抛出异常较多的程序的性能。
主要介绍了java异常处理机制示例(java抛出异常、捕获、断言),需要的朋友可以参考下
深入理解java异常处理机制Java开发Java经验技巧共19页.pdf.zip
java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字。 try 关键字后紧跟一个花括号括起来的代码块,简称try块。同理:下面的也被称为相应的块。 它里面可置引发异常的代码。catch后...
基于Java异常处理机制的研究,张军芳,肖华山,异常处理是Java语言的重要机制,有效地处理异常对程序的可靠性、健壮性是十分重要的。本文分析了异常处理机制的概念和指导原则,��
上海交通大学 Java语言程序设计 JAVA讲义 第08章 java异常处理机制(共45页).ppt 上海交通大学 Java语言程序设计 JAVA讲义 第09章 Java输入输出及文件操作(共82页).ppt 上海交通大学 Java语言程序设计 JAVA讲义 ...
浅析Java异常处理机制.pdf
Java异常处理机制应用研究
Java异常处理机制及应用
【完整课程列表】 ...09 Java异常处理机制和调试(共32页).ppt 10 java集合框架(共27页).ppt 11 JAVA UI swing编程基础(共39页).ppt 12 AWT布局管理器(共14页).ppt 13 AWT事件处理模型(共29页).ppt
基于Java异常处理机制的软件健壮性研究最终版.pdf
Java异常处理机制及应用研究
基于Java异常处理机制的分析.pdf