`
得小白者天下得
  • 浏览: 8287 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java中Finally块的执行

    博客分类:
  • java
阅读更多
在try{}catch{}finally{}块中,都知道finally子块是肯定会执行的。当然也有个别情况,当在try{}或者catch{}块中出现强制退出System.exti(int)时,finally子块就不会执行了。这种情况不在今天的谈论范围以内。
看代码更加直观些:
package practice;

public class FinallyRun {
	private int a = 0;

	public int getInt() {
		try {
			a = 1;
			return a;
		} finally {
			a = 2;
//			return a;
		}
	}

	public static void main(String[] args) {
		FinallyRun f = new FinallyRun();
		int tmp = f.getInt();
		System.out.println("f.getInt() = " + tmp);
		System.out.println("f.a = " + f.a);
	}

}

我在a=1出打了断点,单步跟踪发现:尽管try中包含return,并且try中的return语句执行完,程序就会跳到finally中,继续跑下去,然后返回退出getInt()方法。结果如下:
f.getInt() = 1
f.a = 2

从结果中可以看出,getInt()方法返回值的1,而变量a的值为2。把代码中的注释取消,运行程序结果如下:
f.getInt() = 2
f.a = 2

这次变量a的值和方法返回值都为2。
在此多谢@abc08010051指出错误,让我离真相又进了一步。
在try{}中return执行后(但是return子句还没执行完),会把return流中的变量缓存并保留一份副本,这个副本对于finally子块是不可见的。接着进入finally子块中,虽然finally中修改了变量a的值,但是没有影响到副本的值。如果finally中没有return、break或者continue和异常,那么方法就会从try中退出,并返回缓存中的变量值;如果finally中也有return语句,那么finally子块中的return流就会覆盖之前try{}中的return流,修改缓存中的变量值,返回被修改的值,然后方法退出。

如有不对,敬请指正。
2
0
分享到:
评论
5 楼 abc08010051 2014-11-17  
得小白者天下得 写道
abc08010051 写道
得小白者天下得 写道
谢谢指正,受教了。请问是书上哪一节的内容,我在细细品味一番。不胜感激
abc08010051 写道
finally语句块是在try语句块中的return之前执行的,在返回之前try的return会把返回的值存到一个变量中,执行完finally之后再找到原来存储的变量值返回;如果finally中加了return,finally例程不会再返回到try中的return中返回,而是直接返回了,finally语句块有个不对称调用和返回,这个深入Java虚拟上讲的很不错


第18章 finally语句,结合java bytecode editor看,效果不错


看见你的blog了  豁然开朗的感觉。刚接触这些东西,很多都不懂。谢谢

加油加油,都是一步一步的来的
4 楼 得小白者天下得 2014-11-16  
abc08010051 写道
得小白者天下得 写道
谢谢指正,受教了。请问是书上哪一节的内容,我在细细品味一番。不胜感激
abc08010051 写道
finally语句块是在try语句块中的return之前执行的,在返回之前try的return会把返回的值存到一个变量中,执行完finally之后再找到原来存储的变量值返回;如果finally中加了return,finally例程不会再返回到try中的return中返回,而是直接返回了,finally语句块有个不对称调用和返回,这个深入Java虚拟上讲的很不错


第18章 finally语句,结合java bytecode editor看,效果不错


看见你的blog了  豁然开朗的感觉。刚接触这些东西,很多都不懂。谢谢
3 楼 abc08010051 2014-11-16  
得小白者天下得 写道
谢谢指正,受教了。请问是书上哪一节的内容,我在细细品味一番。不胜感激
abc08010051 写道
finally语句块是在try语句块中的return之前执行的,在返回之前try的return会把返回的值存到一个变量中,执行完finally之后再找到原来存储的变量值返回;如果finally中加了return,finally例程不会再返回到try中的return中返回,而是直接返回了,finally语句块有个不对称调用和返回,这个深入Java虚拟上讲的很不错


第18章 finally语句,结合java bytecode editor看,效果不错
2 楼 得小白者天下得 2014-11-16  
谢谢指正,受教了。请问是书上哪一节的内容,我在细细品味一番。不胜感激
abc08010051 写道
finally语句块是在try语句块中的return之前执行的,在返回之前try的return会把返回的值存到一个变量中,执行完finally之后再找到原来存储的变量值返回;如果finally中加了return,finally例程不会再返回到try中的return中返回,而是直接返回了,finally语句块有个不对称调用和返回,这个深入Java虚拟上讲的很不错

1 楼 abc08010051 2014-11-16  
finally语句块是在try语句块中的return之前执行的,在返回之前try的return会把返回的值存到一个变量中,执行完finally之后再找到原来存储的变量值返回;如果finally中加了return,finally例程不会再返回到try中的return中返回,而是直接返回了,finally语句块有个不对称调用和返回,这个深入Java虚拟上讲的很不错

相关推荐

    Java中finally块执行与return关系深度剖析

    Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。

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

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

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

    `finally`块执行完毕后,才会使用其自身的`return`(如果有)或者原始`return`的值来返回结果。 在实际编程中,这种行为的一个常见应用场景是确保资源的释放。例如,如果你在`try`块中打开一个文件流,然后在`...

    java finally块执行时机全面分析

    这个指令使得JVM能够调转到`finally`块执行,然后在`finally`块执行完毕后,恢复执行流程。在执行`jsr`指令前,返回值会被保存在局部变量中,这样即使`finally`块内部有异常或返回值,也能保证返回一致性。 在实际...

    Java中finally和return的关系实例解析

    如果finally语句中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,而是会得到finally块的返回值,并且不会捕获异常。 在Java中,还有一个非常重要的知识...

    深入浅析java中finally的用法

    finally块可以保证在try和catch语句中抛出异常时,仍然可以执行finally块中的代码,从而避免资源的浪费和泄露。 finally的基本结构由关键字finally和后面的finally块组成。finally块可以用在try/catch语句中,并且...

    try_catch_finally异常处理java

    本文将深入探讨Java中的`try-catch-finally`语句块,以及它们在异常处理中的作用。 首先,`try`块是异常处理的起点。在这个代码段中,我们通常会放置可能会抛出异常的代码。当Java执行到可能抛出异常的代码行时,...

    Java中Finally关键字

    Java中的`finally`关键字是异常处理机制的重要组成部分,它的主要作用是确保在程序执行过程中,不论是否发生异常,某些特定的代码段总会被执行。这在处理资源清理、保证程序完整性和防止资源泄露等方面非常关键。 ...

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

    在Java编程中,`finally`语句块是一个关键的组成部分,尤其在异常处理中起到至关重要的作用。然而,关于`finally`的执行原理,并非所有程序员都对其有深入的理解。`finally`的主要功能是在程序执行过程中确保某些...

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

    try、catch、finally、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return 执行顺序的规则和特点。 首先,我们需要了解 try...

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

    例如,在try语句块中执行了System.exit(0)语句,终止了Java虚拟机的运行,finally语句块也不会执行。 下面是一个示例代码Demo2: public class Test { public static void main(String[] args) { System.out....

    Java高级工程师岗位笔试题目.docx

    如果try块中没有抛出异常,则catch块和finally块都不会执行 C. finally块无论是否发生异常都会执行 D. catch块和finally块至少需要一个 4. 下列哪项是Java中的集合框架(Collections Framework)的一部分,用于...

    try-catch-finally捕获异常

    4. finally块执行完毕后,程序继续执行下一条语句。 五、myDevide()方法 myDevide()方法是本实验中定义的方法,用于执行除法运算。该方法中使用try-catch-finally语句捕获和处理除法运算中的异常。myDevide()方法...

    Java 实例 - Finally的用法源代码-详细教程.zip

    在Java编程语言中,`finally`块是一个非常关键的组成部分,它主要用于确保程序中的某些代码无论在任何情况下都会被执行。这个知识点在Java学习过程中尤为重要,因为它关乎程序的异常处理和资源管理。`finally`通常与...

    Java软件开发实战 Java基础与案例开发详解 10-5 finally关键字 共7页.pdf

    System.out.println("这是finally块,无论是否有异常,都会被执行"); } System.out.println("程序继续执行..."); } } ``` 在这个例子中: - `try`块尝试执行一个会导致除零异常的操作。 - `catch`块捕获并处理...

    浅谈Java中return和finally的问题

    1. **`finally` 会执行**:无论 `try` 块中的 `return` 是否执行,`finally` 语句块总是会被执行。这是Java异常处理机制的一部分,目的是确保资源清理等重要操作能够得到执行,不受异常或正常退出的影响。 2. **`...

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

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

    java try…catch…finally捕获异常的实例

    `finally`块包含在`try-catch`结构中,无论是否发生异常,`finally`块中的代码都会被执行。这通常用于清理资源,如关闭文件流、网络连接等。 ```java finally { // 清理代码,确保无论是否发生异常都会执行 } ``` ...

    java中try catch的用法

    // finally块总是会被执行,无论try-catch块中是否发生异常 // 通常用来释放资源等操作 } ``` #### 三、示例分析 根据题目提供的代码示例,我们来进行更深入的解析: ```java import java.io.*; public class ...

    在静态编译器中实现Java异常机制的算法.pdf

    在该算法中,首先需要分析 Java 程序的语法树,识别出 try 块、catch 块和 finally 块,然后根据 Java 异常处理逻辑,生成对应的机器代码。 在该算法中,需要考虑到多种情况,例如 try 块抛出异常、catch 块处理...

Global site tag (gtag.js) - Google Analytics