java的finally_Java的finally理解
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理解相关推荐
- python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...
Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...
- 关于java多态中覆盖的理解
在前面一篇文章中,我已经介绍了关于java多态中重载的理解与规则 所以这篇文章主要介绍多态中的覆盖机制. 首先重载与覆盖除了表现方式不同之外,还有运行时间上的不同,重载是在编译期间就已经可以确定好调用 ...
- Java异常处理深入理解_关于java异常处理机制的深入理解.doc
关于java异常处理机制的深入理解.doc 关于JAVA异常处理机制的深入理解1引子TRYCATCHFINALLY恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过 ...
- [转载] Java内存管理-你真的理解Java中的数据类型吗(十)
参考链接: Java中的字符串类String 1 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 推荐阅读 第一季 0.Java的线程安全.单例模式.JVM内存结构等知识 ...
- JAVA 枚举类的初步理解
JAVA 枚举类的初步理解 现在Java的枚举类在真实项目中已经用的比较频繁,比静态常量更好用,也更有限定性,enum类可以用来表示有限的类对象,比如星期.月份.性别或者项目中的产品类型 像诸如此类的 ...
- Java 面向对象:static的理解
Java 面向对象:static的理解以及各个代码块的运行顺序 一.static关键字 static修饰方法--称为静态方法,可以直接通过类名调用 static修饰变量--称为静态变量,能被类中所有实 ...
- Java 面向对象:多态的理解
Java 面向对象:多态的理解 一.多态的定义 一个对象的实际类型是确定的,但可以指向引用对象的类型可以有很多(父类,有关系的类) 操作符的多态 +可以作为算数运算,也可以作为字符串连接 类的多态 父 ...
- Java 面向对象:重写的理解
Java 面向对象:重写的理解 一.重写的概念: 子类可以继承父类的对象方法 在继承后,重复提供该方法,就叫做方法的重写,又叫覆盖 override 二.实例: 1. 父类Mi10,提供SOC的打印方 ...
- Java虚拟机JVM简介与理解(三)
Java虚拟机JVM简介与理解(三) 问题背景 PC程序计数器 虚拟机栈 本地方法栈 堆 元空间 方法区 运行时常量池 直接内存 Lyric: 彻底把我囚禁在你的呼吸 问题背景 Java虚拟机JVM简 ...
最新文章
- SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!
- sublime text 的小细节设置,让你的代码更优美
- VS2015快捷键使用学习总结
- oracle no such file or directory,ORA-09925 Linux-x86_64 Error: 2: No such file or directory
- NLP实战-中文命名实体识别
- 十二. python面向对象主动调用其他类
- go调用ffmpeg
- 【Spring第一篇】ClassPathXmlApplicationContext工作原理
- 面向对象编程:Java复杂数据类型用法
- 不格式化U盘的情况下部署WinPE
- 必备效率:一个让你不再加班的小白编程课
- 往十年不忘初心,新十年不负韶华丨万字长文带你完整回顾2020数据技术嘉年华
- JAVA代码生成器源码-基于SSM架构
- GitHub 上100个优质前端项目整理,非常全面!
- 16进制与byte的转换
- 评:从决赛能看到什么?我个人认为.五年内周宇是五人的冠军!!
- 如何安装husky_GitHook 工具 —— husky介绍及使用
- win7打开计算机一片空白,win7系统打开本地连接属性一片空白的解决方法
- python rest api_Python 快速使用 REST API
- 信息技术课程计算机硬件,初一《信息技术》《计算机硬件及工作原理》说课稿-初中信息技术说课.doc...