关于finally语句的一些小秘密_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 关于finally语句的一些小秘密

关于finally语句的一些小秘密

 2013/11/6 16:10:53  风-起-了  程序员俱乐部  我要评论(0)
  • 摘要:刚才在一个人的blog中看到一个关于java中的finally里的语句在什么时候执行的文章,感觉还是挺有收获的,现在就把他的大致意思以及自己的验证和大家分享下在java的API中,关于的finally的介绍是无论异常处理try-catch语句是否抛出异常,finally中的语句都会执行。因此我们可以在finally语句中做很多必须要做的操作,比如流关闭、链接关闭等。但是有个问题,如果try最后return语句,那finally里的语句又是什么时候去执行呢?这个问题先不回答
  • 标签:all

? ? ?刚才在一个人的blog中看到一个关于java中的finally里的语句在什么时候执行的文章,感觉还是挺有收获的,现在就把他的大致意思以及自己的验证和大家分享下

? ? 在java的API中,关于的finally的介绍是无论异常处理try-catch语句是否抛出异常,finally中的语句都会执行。因此我们可以在finally语句中做很多必须要做的操作,比如流关闭、链接关闭等。

? ? 但是有个问题,如果try最后return语句,那finally里的语句又是什么时候去执行呢?

? ? 这个问题先不回答,我们先看下面几个测试用例,看完之后也许你就知道了点什么。

class="java" name="code"> /**  
 *@Description: 关于finally的测试
 */ 
package cn.lulei.test;  
  
public class Test {
	
	public int testFinally(){
		int x = 1;
		try{
			return x;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		} finally {
			x++;
			System.out.println("x = " + x);
		}
	}
	
	public static void main(String[] args) {
		System.out.println("testFinally:" + new Test().testFinally());
	}
}

?输出结果是:

x = 2

testFinally:1

?

 /**  
 *@Description: 关于finally的测试
 */ 
package cn.lulei.test;  
  
public class Test {
	
	@SuppressWarnings("finally")
	public int testFinally(){
		try{
			return function1();
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		} finally {
			return function2();
		}
	}
	
	private int function1(){
		System.out.println("function1");
		return 1;
	}
	private int function2(){
		System.out.println("function2");
		return 2;
	}
	
	public static void main(String[] args) {
		System.out.println("testFinally:" + new Test().testFinally());
	}
}

?输出结果是:

function1

function2

testFinally:2

?

? ? 看完这两个测试用例,是不是感觉finally中的语句好在try中的return语句之前,又好像在try中的return语句之后。其实finally中的语句更确切的说是在return中间运行的,这里也许你会说,return语句明显就是一步,哪里来的中间,不错,是没有中间,但是如果从整体来看,也许就“有了”,下面就简单分析下:

? ? A函数调用B函数并得到结果的过程,就好比A函数准备好了一个空罐子,当B函数要返回结果时,先把结果放在罐子里①,然后再将程序逻辑返回到A函数②。所谓的返回,就是B函数说,我不运行了,你A函数继续运行吧。这时我们再回头看一下上面的测试用例,第一个没有什么好说的,B把1放到罐子里,又运行了若干操作,最后告诉A函数继续运行,所以得到上图的结果;第二个也是一样,B函数先把1放到罐子里,然后继续运行一些操作,这时B发现该把2放到罐子里的,因此又把罐子里的值换成2,最后告诉A函数继续运行,所以A函数得到的返回值是2而不是1。所以实际上,当罐子里面有值的时候,B并不是立即通知A,而是等finally里面的语句全部执行完之后,采去通知A的,这样解释return就相当于有中间了。

发表评论
用户名: 匿名