`
风-起-了
  • 浏览: 7454 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于finally语句的一些小秘密

    博客分类:
  • java
阅读更多

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

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

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

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

 /**  
 *@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就相当于有中间了。

分享到:
评论

相关推荐

    17.javatry…catch…finally语句.zip

    17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句...

    java 中finally语句块与return的执行关系

    Java 中 finally 语句块与 return 的执行关系 Java 中的 finally 语句块是用于保证无论出现什么情况,一定要执行的代码块。在 try-catch-finally 结构中,finally 语句块的执行顺序是非常重要的。下面我们来详细...

    关于Java中finally语句块的深度辨析.doc

    关于Java中finally语句块的深度辨析.doc

    Java语言finally语句详解,finally到底是在return之前还是之后执行.zip

    Java语言finally语句详解,finally到底是在return之前还是之后执行.zip

    Java finally语句到底是在return之前还是之后执行?

    在Java编程语言中,`finally`语句块是一个非常关键的结构,用于确保特定代码无论在任何情况下(包括异常发生或正常返回)都会被执行。这个特性使得`finally`成为处理资源清理,如关闭文件流、数据库连接等操作的理想...

    josonle#Coding-Now#finally语句如何执行1

    - 无论try是否发生异常,finally语句都会执行- 如果try/catch中包含控制转移语句(return、continue、break),finally

    try...catch...finally语句的相关案列

    try...catch...finally语句的相关案列

    try-catch-finally捕获异常

    finally块是try-catch-finally语句的第三部分,用于执行一些资源释放、关闭或清理的操作。finally块总是会被执行,無論try块中是否出现异常。finally块的语法结构如下: ```java finally { // 资源释放或清理操作 ...

    Delphi异常处理try_except语句和try_finally语句用法以及区别.pdf

    ### Delphi异常处理try_except语句和try_finally语句用法以及区别 #### 异常的来源 在Delphi的应用程序中,多种情况都可能导致异常的产生,具体包括: 1. **文件处理**:例如读写文件时遇到权限问题、文件不存在或...

    try、catch、finally、return 执行顺序.doc

    try、catch、finally、return 执行顺序的规则是:try 语句用于包装可能抛出异常的代码,catch 语句用于捕捉 try 语句中的异常,finally 语句用于执行一些清理工作,return 语句用于从方法中返回值。finally 语句是在...

    【Python】详解 try-except-else-finally 语句 —— 异常处理完全解读(上)

    2.3 try-except-else-finally 语句 2.4 小结 三、异常抛出 (Exception raising) 四、异常自定义 (Exception customizing) 五、预定义的清理行为 (with 语句) 六、断言 (Asserting) 七、小结 (Summary) 一、绪论 ...

    讲解Java编程中finally语句的基本使用方法

    在Java编程中,`finally`语句块是一个非常重要的概念,它主要与`try-catch`结构一起使用,用于确保某些代码无论是否发生异常都会被执行。`finally`语句是异常处理模型的一部分,旨在保持代码的整洁性和资源管理的...

    关于Java中的try-catch-finally语句和return

    第一:return语句并不是函数的终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)  第二:finally里面不建议放return语句,根据需要,return语句...

    关于Java中try finally return语句的执行顺序浅析

    关于Java中try finally return语句的执行顺序浅析是Java语言中一个重要的知识点,今天我们来探讨一下try finally return语句的执行顺序。 首先,需要了解的是finally语句块是否一定会执行的问题。很多人第一反应是...

    浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

    Java 中 finally 语句的执行顺序探讨 在 Java 中,finally 语句的执行顺序是一个常见的探讨话题。很多人都认为 finally 语句一定会被执行,但这是不正确的。在某些情况下,finally 语句可能不会被执行,例如在 try ...

    Powershell中Finally语句用法示例

    在Powershell编程中,`Finally`语句是异常处理机制的一个重要组成部分,它用于确保在发生异常或者脚本被用户中断(如通过Ctrl+C)时,某些关键性的清理操作仍然能够被执行。在这个示例中,我们将深入探讨`Finally`...

    完全解析Java编程中finally语句的执行原理

    然而,关于`finally`的执行原理,并非所有程序员都对其有深入的理解。`finally`的主要功能是在程序执行过程中确保某些代码片段无论是否发生异常都会被执行。 首先,我们需要澄清一个常见的误解:`finally`语句块并...

    谈谈Java中try-catch-finally中的return语句

    在Java编程语言中,`try-catch-finally`语句块是异常处理的关键构造,它允许程序员优雅地处理可能出现的异常情况。`return`语句则用于从方法中返回一个值或者结束方法的执行。当这两者结合在一起时,就会出现一些...

    finally结构的注意点(一)

    在本文中,我们将深入探讨 `finally` 的使用和一些需要注意的细节,尤其是与Java相关的知识点。 首先,`finally` 通常与 `try-catch` 结构一起使用。在 `try` 块中,我们执行可能会抛出异常的代码。如果发生异常,...

    C++ 中try finally关键字详解

    try-finally语句是Microsoft对C和C++语言的扩展,它能使32位的目标程序在异常出现时,有效保证一些资源能够被及时清除,这些资源的清除任务可以包括例如内存的释放,文件的关闭,文件句柄的释放等等。try-finally...

Global site tag (gtag.js) - Google Analytics