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. POJ 1716 Integer Intervals 差分约束

    题目:http://poj.org/problem?id=1716 #include <stdio.h> #include <string.h> #include <ve ...

  2. Cocoa Touch 框架

    Cocoa Touch包括: (1)Core Animation: 通过Core Animation,可以通过一个基于独立图层的简单的编程模型来创建丰富的用户体验. (2)Core Audio: Co ...

  3. JS简单仿QQ聊天工具的制作

    刚接触JS,对其充满了好奇,利用刚学到的一点知识,写了一个简单的仿QQ聊天的东西,其中还有很多的不足之处,有待慢慢提高. 功能:1.在输入框中输入内容,点击发送,即可在上方显示所输入内容. 2.点击‘ ...

  4. JavaEE下载文件名不显示中文的问题

    我们在做JavaEE项目下载文件时,在我们熟悉的UTF-8编码下经常会发现文件名中文乱码.中文不显示等状况,此时,将文 件名改一下编码或许会解决这个烦恼: fileName = new String( ...

  5. bzoj 1068: [SCOI2007]压缩 DP

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 496  Solved: 315[Submit][Status] D ...

  6. Essential Sublime Text Plugins

    Essential Sublime Text Plugins Add some killer tools to your arsenal. View them all at /repo/sublime ...

  7. java虚拟机运行机制

    转自java虚拟机运行机制 首先简单阐述下解释型语言和编译型语言的联系与区别. 编译型语言是通过编译器将程序编译成目标机器所能识别的机器码,而解释型语言不需要编译过程.由该语言的解释器读取脚本,按照语 ...

  8. tornado异步请求的理解(转)

    tornado异步请求的理解 http://www.kankanews.com/ICkengine/archives/88953.shtml 官网第一段话: Tornado is a Python w ...

  9. Celery Flower监控,完美搞定

    XXXX啊,,从上午就看到QUEQUE有问题,但一直不晓得哪里出了问题, 后来,安装上FLOWER看一下,队列就出来了... 神器啊.. 安装不说,运行很EASY.. celery flower -A ...

  10. 系统的了解DJANGO中数据MODULES的相关性引用

    数据库结构如下: from django.db import models class Blog(models.Model): name = models.CharField(max_length=1 ...