`
得小白者天下得
  • 浏览: 7874 次
  • 性别: 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的执行关系

    finally语句块与return的执行关系

    java finally块执行时机全面分析

    下面小编就为大家带来一篇java finally块执行时机全面分析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    try-catch-finally执行顺序验证

    try-catch-finally执行顺序验证(左边是....(2)如果finally中无return则执行return var,finally块中的操作不会影响var的值(如果var的值是对象的内存地址,则finally块的操作可以改变该对象的属性值)。 验证 1.基本类型

    Java中的异常处理机制.md

    try块包含可能会抛出异常的代码,catch块包含用于处理特定类型异常的代码,finally块包含无论是否发生异常都需要执行的代码。 示例: ```java try { // 尝试执行的代码,可能会抛出异常 int result = 10 / 0; ...

    Java异常处理.md

    - 不论try块中的代码是否抛出异常,finally块内的代码都会被执行。这在资源清理场景(如关闭文件流)中尤其重要,确保资源无论在何种情况下都能得到正确释放。 3. **自定义异常类**: - Java允许开发者扩展`java....

    Java关键字finally_动力节点Java学院整理

    java关键字finally不管是否出现异常,finally子句总是在块完成之前执行。下面通过实现代码给大家介绍Java关键字finally相关知识,需要的的朋友参考下吧

    java大厂面经、直击BAT

    无论是否抛出异常,finally代码块都会执行,它主要是用来释放应用占用的资源。finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收之前由Java虚拟机来调用的。 ## 四. finally到底是在return之前...

    Java面试问题带答案40道.docx

    5. try-catch-finally块中有哪些必须要有的部分? 答:try和catch块是必须要有的部分,finally块是可选的。 6. 什么是异常处理? 答:异常处理是指在程序执行过程中遇到错误时进行处理的机制。Java中使用try-catch...

    常用JAVA面试题大全

    finally—在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize —方法名。Java 技术允许使用 finalize() ...

    java 模拟 面试题 答案

    finally在异常处理时提供finally块来执行任何清除操作。无论有没有异常被抛出、捕捉,finally块都会被执行。 finalize是方法名。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的...

    Java面试题及答案-java面试题

    Java 中的 final、finally 和 ...finally:“finally”块用于 try-catch 语句中,以确保执行某些代码,无论是否抛出或捕获异常。 finalize:“finalize”方法在对象类中用于在对象被垃圾回收之前执行清理。不推荐使用

    21天学会java开发网络游戏

     finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize()...

    Java面试题及答案(面试题集锦)

     finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。  finalize—方法名。Java 技术允许使用 ...

    10道Java常见异常面试题含答案(很全)

    Java异常处理是Java编程中一个非常重要的部分,它允许程序在遇到错误或异常情况时采取适当的行动...finally语句块:无论是否发生异常,finally语句块中的代码都将被执行。通常用于清理资源,例如关闭文件或数据库连接。

    java基础知识-try-catch的使用

    try块中包含可能会产生异常的代码,当try块内的代码发生异常时,程序...另外,finally块是可选的,它会在try-catch块执行完毕后始终被执行,无论是否发生异常。finally块通常用于释放资源、关闭文件等必要的清理工作。

    JAVA面试经典试题

    再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾...

    JAVA 面试32问

    在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。 finalize 方法名。Java 技术允许使用finalize()方法在垃圾收集器将...

    Java程序员面试32问

    finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize() ...

Global site tag (gtag.js) - Google Analytics