`
xpjsky
  • 浏览: 2563 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

当return遇上finally

    博客分类:
  • Java
JVM 
阅读更多
try中含return,finally将如何处理?

我们通过下面的例子来分析一下:
public class Test{
	private static K k = new K();//此时k.i=0;
	private static int k1 = 0;
	public static void main(String[] args){
		System.out.println("before: i = " + k.i);	//此时k.i = 0;
		System.out.println("reVal: i = " + test().i); 	//此时呢?k.i=?
		System.out.println("after: i = " + k.i);	//此时k.i = 1;
		//输出是0 1 1

		System.out.println("before: k1 = " + k1);	//此时k1 = 0;
		System.out.println("reVal: k1 =" + test2());	//此时呢?k1=?
		System.out.println("after: k1 = " + k1);	//此时k1 = 1;
		//输出是0 0 1

	}
	public static K test(){
		try{
			return k;
		} finally {
			k.i++;	//对K的i加1,保证其改变
		}
	}
	public static int test2(){
		try{
			return k1;
		} finally {
			k1++;
		}
	}
}
class K{
	public int i = 0;
}

结果分析:(结果是0 1 1)
  很显然,在test方法调用中,return语句彻底执行完之前,也就是return之前,应该先执行了finally语句。那么为什么是彻底执行完之前?经过测试可以发现,如果test方法返回的是一个基本数据类型(比如说int)时,那么结果将和本次的测试结果不一致,int时的结果是0 0 1。
  也就是说,在程序执行return语句时,如果return后面的表达式是一个基本数据类型,那么JVM应该先保存这个基本数据类型(类似值传递时的做法——复制),然后执行finally语句,当finally语句块执行完毕后,将保存的值返回。
  如果return后面的表达式是一个引用数据类型,那么JVM应该先保存这个对象的引用(同理,JAVA中只存在值传递,所以JVM应该保存对象的引用拷贝),然后执行finally语句块,执行完后再将刚才保存的对象的引用返回。

  第一种情况因为是基本数据类型,所以返回值等于保存值,所以本例返回结果为0;
  第二种情况因为是引用数据类型,所以返回值是对象的引用,而对象的属性已经改变(在finally语句块中),所以返回后取出对象的属性发现已经变成1了。
0
0
分享到:
评论

相关推荐

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

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

    try-finally-return-in-finally.rar_return

    综上所述,`try-finally` 结构结合`return`语句的使用是一个重要的编程概念,尤其在处理异常和资源释放时。正确理解和应用这一机制可以提高代码的稳定性和可读性。而针对大量嵌套括号的正则表达式,我们需要关注其...

    try-catch-finally-return-in-finally.rar_return

    然而,当 `return` 语句在 `finally` 块中时,情况有所不同。虽然 `finally` 会确保其内的代码被执行,但 `return` 仍然会影响函数的返回值。这意味着,如果在 `finally` 块中有 `return`,那么这个 `return` 将覆盖...

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

    当解释器遇到`return`语句时,它会创建一个包含返回值的对象,并将其存储在一个内部数据结构中。然后,解释器跳转到`finally`块,执行其中的代码。即使在`finally`块中有`return`,原始的`return`语句的返回值也不会...

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

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

    浅谈Java中return和finally的问题

    当一个 `try` 块中包含 `return` 语句时,`finally` 语句块的执行情况如下: 1. **`finally` 会执行**:无论 `try` 块中的 `return` 是否执行,`finally` 语句块总是会被执行。这是Java异常处理机制的一部分,目的...

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

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

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

    Java中finally和return的关系实例解析 Java中finally和return的关系实例解析是Java编程语言中一个重要的知识点。finally语句是Java语言中的一种特殊语句,它用于释放资源、关闭文件、关闭网络连接等操作。return...

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

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

    try~catch~finally中关于return的问题

    在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视

    浅析Python中return和finally共同挖的坑

    本文主要给大家介绍了在Python中return和finally共同存在的坑,以及填坑经验,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 初识 return 相信每一个用过Python函数的童鞋, 肯定会用过return...

    Jungle68#-#[Java] try catch finally,try里有return,finally还执行么?1

    Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据

    Java的throw和return

    ### Java的throw和return 在Java编程语言中,`...综上所述,`throw`和`return`是Java中非常重要的控制流结构,它们与`finally`块之间有着紧密的联系。正确理解和运用这些概念对于编写健壮可靠的Java程序至关重要。

    javascript中return,return true,return false三者的用法及区别

     语法为:return 表达式;  语句结果函数的执行,返回调用函数,而且把表达式的值作为函数结果返回出去 ②返回控制无函数结果  语法为:return;  在大多数情况下,为事件处理函数如果让其返回false,可以防止默认的事件...

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

    从结果可以看到,finally 块中的 return 语句会覆盖 try 块中的 return 语句,try 块中的 return 语句就不能返回了。 finally 语句是在 try 的 return 语句执行之后,return 返回之前执行的。 finally 块中的 ...

    51单片机return怎么用?单片机return的用法

    ### 51单片机Return用法详解 #### 引言 在51单片机编程过程中,`return`关键字的正确使用对于确保程序逻辑的准确性和效率至关重要。本文将详细探讨51单片机中`return`的两种常见用法,并通过具体的代码示例来分析这...

    try-catch-finally捕获异常

    try-catch-finally语句是Java语言中一种常用的异常处理机制,当程序在执行过程中出现异常时,可以使用try-catch-finally语句来捕获和处理异常。下面将详细介绍try-catch-finally语句的使用方法和注意事项。 一、try...

    finally结构的注意点(一)

    1. **返回值**:如果 `finally` 块包含 `return` 语句,那么它将覆盖 `try` 或 `catch` 块中的任何 `return` 语句。这意味着最后的返回值是由 `finally` 块决定的。 2. **跳转语句**:即使使用了 `break`、`...

    Java异常处理中同时有finally和return语句的执行问题

    在Java编程语言中,异常处理机制是...当两者同时存在时,`finally`块的代码总是先执行,但最终的返回值由最后遇到的`return`语句决定。在编写代码时,理解这种行为可以帮助避免意外的程序行为,并确保程序的健壮性。

Global site tag (gtag.js) - Google Analytics