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.将临时区域的返回值送到上一级方法中。

参考:

《thinking in Java》

http://blog.csdn.net/jiasanshou/article/details/6996932

以上为个人理解,若有不对之处,望不吝指正。

java的finally_Java的finally理解相关推荐

  1. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  2. 关于java多态中覆盖的理解

    在前面一篇文章中,我已经介绍了关于java多态中重载的理解与规则 所以这篇文章主要介绍多态中的覆盖机制. 首先重载与覆盖除了表现方式不同之外,还有运行时间上的不同,重载是在编译期间就已经可以确定好调用 ...

  3. Java异常处理深入理解_关于java异常处理机制的深入理解.doc

    关于java异常处理机制的深入理解.doc 关于JAVA异常处理机制的深入理解1引子TRYCATCHFINALLY恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过 ...

  4. [转载] Java内存管理-你真的理解Java中的数据类型吗(十)

    参考链接: Java中的字符串类String 1 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 推荐阅读 第一季 0.Java的线程安全.单例模式.JVM内存结构等知识 ...

  5. JAVA 枚举类的初步理解

    JAVA 枚举类的初步理解 现在Java的枚举类在真实项目中已经用的比较频繁,比静态常量更好用,也更有限定性,enum类可以用来表示有限的类对象,比如星期.月份.性别或者项目中的产品类型 像诸如此类的 ...

  6. Java 面向对象:static的理解

    Java 面向对象:static的理解以及各个代码块的运行顺序 一.static关键字 static修饰方法--称为静态方法,可以直接通过类名调用 static修饰变量--称为静态变量,能被类中所有实 ...

  7. Java 面向对象:多态的理解

    Java 面向对象:多态的理解 一.多态的定义 一个对象的实际类型是确定的,但可以指向引用对象的类型可以有很多(父类,有关系的类) 操作符的多态 +可以作为算数运算,也可以作为字符串连接 类的多态 父 ...

  8. Java 面向对象:重写的理解

    Java 面向对象:重写的理解 一.重写的概念: 子类可以继承父类的对象方法 在继承后,重复提供该方法,就叫做方法的重写,又叫覆盖 override 二.实例: 1. 父类Mi10,提供SOC的打印方 ...

  9. Java虚拟机JVM简介与理解(三)

    Java虚拟机JVM简介与理解(三) 问题背景 PC程序计数器 虚拟机栈 本地方法栈 堆 元空间 方法区 运行时常量池 直接内存 Lyric: 彻底把我囚禁在你的呼吸 问题背景 Java虚拟机JVM简 ...

最新文章

  1. SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!
  2. sublime text 的小细节设置,让你的代码更优美
  3. VS2015快捷键使用学习总结
  4. oracle no such file or directory,ORA-09925 Linux-x86_64 Error: 2: No such file or directory
  5. NLP实战-中文命名实体识别
  6. 十二. python面向对象主动调用其他类
  7. go调用ffmpeg
  8. 【Spring第一篇】ClassPathXmlApplicationContext工作原理
  9. 面向对象编程:Java复杂数据类型用法
  10. 不格式化U盘的情况下部署WinPE
  11. 必备效率:一个让你不再加班的小白编程课
  12. 往十年不忘初心,新十年不负韶华丨万字长文带你完整回顾2020数据技术嘉年华
  13. JAVA代码生成器源码-基于SSM架构
  14. GitHub 上100个优质前端项目整理,非常全面!
  15. 16进制与byte的转换
  16. 评:从决赛能看到什么?我个人认为.五年内周宇是五人的冠军!!
  17. 如何安装husky_GitHook 工具 —— husky介绍及使用
  18. win7打开计算机一片空白,win7系统打开本地连接属性一片空白的解决方法
  19. python rest api_Python 快速使用 REST API
  20. 信息技术课程计算机硬件,初一《信息技术》《计算机硬件及工作原理》说课稿-初中信息技术说课.doc...

热门文章

  1. JavaScript的经典高频面试题解析
  2. IC领域常见职位简称AE、FAE、PE、SE、VE、ME、TE、PTE
  3. Logisim的基本使用方法(详细)教你如何使用Logisim
  4. css绘图(三):教你用css绘制一个qq企鹅!
  5. Cloudflare Workers 实现301网址跳转
  6. js 使用setInterval()实现实时刷新
  7. 胡莱三国2服务器维护,不想说再见《胡莱三国2》安卓首测完美收官
  8. oracle call作用,Oracle call 和 exec的详解及区别
  9. adb命令导出手机应用
  10. MyBatis-Plus使用详解