1.为什么要用finally
先看一个没有finally的异常处理try-catch语句:
假设count为要使用到的资源,并且用完要求释放此资源。那么我们可以把释放资源的语句放到try-catch后执行,当前的程序不管是在执行完try语句块还是catch语句块,都会顺序执行到下面释放资源的语句。
int count = 0;  //初始化资源
try{
  count++;
  if(count == 1) throw new Exception("Exception in try");
}catch(Exception e){
  System.out.println("catch block");
}
count = 0; //释放资源

但是,如果在try或catch中有多条return语句,那么在每条return语句之前,都要先执行释放资源的语句:
public void f() throws Exception {
 int count = 0;  //初始化资源
 try{
   doSomething;
   statementMayCauseException;  //可能会抛出异常的语句,若异常没有被catch,则直接抛出,也不会执行到try-catch下面的语句
   doSomething;
   if(count == 1) throw new Exception1("E1 in try");
   if(count == 2) throw new Exception2("E2 in try");
 }catch(Exception1 e){
   count = 0; //释放资源
   throw e;  //再次把异常抛出,让上一级捕获。此时将不会执行catch外的语句,所以要先释放资源
 }catch(Exception2 e){
  count = 0; //释放资源
  return; //返回了,也不会执行catch外的语句,所以要先释放资源
 }
 count = 0; //释放资源
}
这样,就需要在每一个可能返回的地方,以及每一个可能出现异常而导致程序跳转的地方,考虑如何释放资源,导致复杂和冗余。

所以,需要finally语句。
把资源释放或状态还原的代码放到finally块中,可以保证在try和catch语句执行完后,一定会执行finally语句块,而不用考虑各种复杂的跳转情况。
int count = 0;
try{
 count++;
 if(count == 1)throw new Exception();
}catch(Exception e){
}finally{
 count = 0;
}

2.finally什么时候执行
finally在return语句之后,跳转到上一级程序之前执行。
public class Test { 
 public static void main(String[] args) {  
  System.out .println(test ());  
 }   
 public static String test() {  
  try {  
   System.out .println("try block");  
   return test1 ();  
  } finally {  
   System.out .println("finally block");
   //return "finally";    
  }  
 }  
 public static String test1() {  
  System.out .println("return statement");  
  return "after return";  
 }  
}
结果:
try block
return statement
finally block
after return

分析:
1.try语句块,return test1(),则调用test1方法
2.test1()执行后返回"after return",返回值"after return"保存在一个临时区域里
3.执行finally语句块。若finally语句有返回值,则此返回值将替换掉临时区域的返回值
4.将临时区域的返回值送到上一级方法中。

亲测是正确的:如果若finally语句有返回值,则此返回值将替换掉临时区域的返回值
参考:
《thinking in Java》

http://blog.csdn.net/mymyway/article/details/7954549

2,验证finally真正执行顺序

package lee;
    import java.io.*;
    public class Test1{
    public static void main(String argv[]){
      Test1 m=new Test1();
    System.out.println(m.amethod());
    }
    public int amethod(){
       try{
           FileInputStream dis =new FileInputStream("Hello.txt"); //1,抛出异常
       }catch ( Exception ex) {
               System.out.println("No such file found");   //2.catch捕获异常,并执行
               return -1;                                  //4,return 返回
       }finally{
               System.out.println("Doing finally");  //3.finally一定会执行,在return之前。(准确说,应该是return ;语句)

}
        return 0;
    }
    }

输出结果为:

No such file found
    Doing finally
    -1

总结:finally其实是仅在return ; 语句执行前执行,如果return 一个函数,那么会先执行函数,但如果函数内有(return ;)语句,那么finally就会在这个(return ;)语句前执行。

ps:如果catch块有异常向外抛出,执行顺序呢:我执行说,你抛你得异常,我finally我的语句,我俩互不干涉,你别管我啥时执行,但我一定会执行的亲。 = =

关于finally,此时,应该很明朗了  您只需记着一点:除非调用system.exit()让程序退出或断电等因素致使程序中止,否则,无论任何因素,finally块都一定会执行!!

转载于:https://blog.51cto.com/mrwlh/1085839

java try、catch、finally及finally执行顺序详解相关推荐

  1. Java 中 finally 与 return 的执行顺序详解

    java方法是在栈幀中执行,栈幀是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间,栈幀分为三个区域: 1 . 操作数栈,用来保存正在执行的表达式中的操作数, ...

  2. unity 继承会调用start吗_Unity 继承MonoBehaviour脚本 执行顺序 详解

    先看结果 Awake ->OnEnable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ...

  3. java web 启动顺序_JavaWeb开发Servlet过滤器链执行顺序详解

    ***第一份手记*** 下午时间观看老师讲的视频,自己动手实践练习得出的结论,讲其分享出来给大家,不喜勿喷,有那里说的不对讲得不好还请大家一一指出,谢谢! 过滤器链的执行顺序是服务器按照web.xml ...

  4. java filter 调用链_JavaWeb开发Servlet过滤器链执行顺序详解

    ***第一份手记*** 下午时间观看老师讲的视频,自己动手实践练习得出的结论,讲其分享出来给大家,不喜勿喷,有那里说的不对讲得不好还请大家一一指出,谢谢! 过滤器链的执行顺序是服务器按照web.xml ...

  5. javascript运行机制之执行顺序详解

    JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行.那么JavaScript是怎么来进行解析的吗?它的执行顺序又 ...

  6. Spring面试之不同版本AOP执行顺序详解

    1.AOP常用注解: @Before 前置通知:目标方法之前执行 @After 后置通知:目标方法之后执行(始终执行) @AfterReturning 返回后通知:执行方法结束前执行(异常不执行) @ ...

  7. JS 中关于Promise的用法,状态,执行顺序详解,面试可用(原创)

    前言 在实际项目中我们常会去用已经封装好的promise如axios,或者也会自己去封装promise,甚至在面试中,关于promise的面试题也层出不穷,promise的重要性不言而喻,故写该文章记 ...

  8. 【异步系列二】Promise原理及执行顺序详解

    前言 Promise 是 javascript 中非常重要的一环,熟悉它是必须的,而且在面试中也常常会问到相关面试题. 在了解 Promise 之前,需要了解什么是异步编程,可以参考我的一篇文章:Ja ...

  9. Python装饰器执行顺序详解

    探究多个装饰器执行顺序 装饰器是Python用于封装函数或代码的工具,网上可以搜到很多文章可以学习,我在这里要讨论的是多个装饰器执行顺序的一个迷思. 疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会 ...

最新文章

  1. 为智能手机VR体验而生,ARM公布最新处理器架构
  2. mybatis的mapper.xml中使用java类中的全局变量
  3. 15 - 使用 Fabric 自动化部署
  4. onDraw什么时候被调用?
  5. 初一模拟赛总结(3.30)
  6. tomcat:sessionId生成机制导致tomcat启动过慢问题
  7. 闭合导线坐标计算表_RTK技术导线测量和全站仪导线测量有什么区别?
  8. 洛克人红色思考型机器人叫什么_如何让机器人“好好说话”?
  9. wx 2150183182
  10. Python库pygame下载教程
  11. c++实习岗面试经历
  12. (一)机器学习入门与经典算法之KNN算法(第一期)
  13. Spring学习笔记-C7-SpringMVC高级技术
  14. 如何检测计算机性能 具体步骤,如何测试电脑性能
  15. C语言入门(八)一维数组
  16. 与其自怨自艾,不如夯实勤奋
  17. python毕业设计 基于django框架个人博客系统毕业设计设计与实现
  18. 视频流媒体服务器中怎么降低直播出现的延迟现象?
  19. linux下安装pymssql
  20. 夺命雷公狗—玩转SEO---44---外链群发原理

热门文章

  1. 安卓9.0刷linux,Ubuntu系统下编译Android 9.0系统
  2. wireshark使用_第一次使用WireShark的问题
  3. js表格中将每行的两个数据求和显示_python数据分析相关【一】
  4. 阿尔法蛋机器人tf卡_如父母般陪着你长大,科大讯飞阿尔法蛋智能故事机Z1体验...
  5. php如何实现根据地区内筛选,PHP区块查询实现方法分析
  6. slice 与 substring
  7. Price suggestion(EDA)下--nlp的处理
  8. 混合开发的坑(7) ---输入文本时,键盘遮挡
  9. C++零食:WTL中使用双缓冲避免闪烁
  10. Linux下查看进程和线程