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理解的更多相关文章

  1. Java基础之理解Annotation(与@有关,即是注释)

    Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...

  2. Java 集合深入理解(8):AbstractSequentialList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...

  3. Java 集合深入理解(7):ArrayList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...

  4. Java 集合深入理解(4):List<E> 接口

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...

  5. java线程安全理解

    java线程安全理解 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. ...

  6. java常量池理解

    String类两种不同的创建方式 String s1 = "zheng"; //第一种创建方式 String s2 = new String("junxiang" ...

  7. java多线程的理解

    java多线程的理解   线程的5种状态:新建,就绪,运行,阻塞,死亡. Thread.sleep:线程  运行状态 转为  阻塞状态,(其它线程启动运行) Thread.yield:   线程 运行 ...

  8. 学习java的阶段性理解(其它语言也一样)

    打算从今天开始学java啊,待会滚去找资料了.现在谈一下学习java阶段性的理解.由于现在对java真的啥也不知道啊,不过还是要瞎鸡儿写点自己的看法,以下看法应该也使适用于其它语言: 第一阶段,入门级 ...

  9. 谈谈你对 Java 平台的理解

    声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...

  10. Java六大必须理解的问题

    Java六大必须理解的问题 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列.内容 ...

随机推荐

  1. IntelliJ IDEA 使用随笔

    注册的地址:http://idea.iteblog.com/key.php

  2. Js处理json数据

    js中处理由ajax调用返回的json数据问题,可以通过使用JSON.parse方法将json字符串转化成javascript 对象.通过对象访问属性值. JSON.parse 只限于高版本的浏览器. ...

  3. smarty 比较运算符对照表

    smarty 比较运算符对照表  运算符 中文解释 eq 相等 ne.neq 不相等 gt 大于 lt 小于 gte.ge 大于等于 lte.le 小于等于 not 非 mod 求模 is [not] ...

  4. apache整合tomcat部署集群

    近日,由于公司项目需要,所以学习了apache整合tomcat以及集群的一些知识. 所以做下笔记日后回顾可以用到. apache只有处理静态事物的能力, 而tomcat的强项就是处理动态的请求,所以a ...

  5. ASP.NET多用户操作相同互斥的对象

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3574154.html ] 现象:公有静态变量不可用于ASP.NET多用户操作,否则该变量会被多 ...

  6. 在老项目中使用Gradle:更改默认目录结构

    apply plugin: 'war' sourceCompatibility = 1.5 version = "1.0" //中央仓库 repositories { mavenC ...

  7. ctagst简单应用,将Vim改造:Ctags,Taglist,Cscope,OmniCppComplete,SuperTab,Winmanager,NERDTree,MiniBufExplorer,vimrc

    vim + ctags $ ctags #给同一个目录下的所有文件建立tags 这时在tags文件所在的目录下打开源文件阅读,vim就会自动调用tags文件.如果tags文件不在当前目录下,能在命令模 ...

  8. 一起啃PRML - 1.2.3 Bayesian probabilities 贝叶斯概率

    一起啃PRML - 1.2.3 Bayesian probabilities 贝叶斯概率 @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ 这一节简单讲 ...

  9. 【转】EditText获取焦点不自动弹出键盘设置--失去焦点的方法,不错

    原文网址:http://zouhuajian01.blog.163.com/blog/static/1176987720121128115813176/ 当我们在activity中加入EditText ...

  10. Apache支持.htaccess配置方法

    打开httpd.conf文件用文本编辑器打开后,查找  代码如下 复制代码 Options FollowSymLinks AllowOverride None 改为: Options FollowSy ...