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了。
分享到:
相关推荐
Java 中 finally 语句块与 return 的执行关系 Java 中的 finally 语句块是用于保证无论出现什么情况,一定要执行的代码块。在 try-catch-finally 结构中,finally 语句块的执行顺序是非常重要的。下面我们来详细...
综上所述,`try-finally` 结构结合`return`语句的使用是一个重要的编程概念,尤其在处理异常和资源释放时。正确理解和应用这一机制可以提高代码的稳定性和可读性。而针对大量嵌套括号的正则表达式,我们需要关注其...
然而,当 `return` 语句在 `finally` 块中时,情况有所不同。虽然 `finally` 会确保其内的代码被执行,但 `return` 仍然会影响函数的返回值。这意味着,如果在 `finally` 块中有 `return`,那么这个 `return` 将覆盖...
当解释器遇到`return`语句时,它会创建一个包含返回值的对象,并将其存储在一个内部数据结构中。然后,解释器跳转到`finally`块,执行其中的代码。即使在`finally`块中有`return`,原始的`return`语句的返回值也不会...
try、catch、finally、return 执行顺序详细讲解 try、catch、finally、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return ...
当一个 `try` 块中包含 `return` 语句时,`finally` 语句块的执行情况如下: 1. **`finally` 会执行**:无论 `try` 块中的 `return` 是否执行,`finally` 语句块总是会被执行。这是Java异常处理机制的一部分,目的...
Java语言finally语句详解,finally到底是在return之前还是之后执行.zip
Java中finally和return的关系实例解析 Java中finally和return的关系实例解析是Java编程语言中一个重要的知识点。finally语句是Java语言中的一种特殊语句,它用于释放资源、关闭文件、关闭网络连接等操作。return...
Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。
在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视
本文主要给大家介绍了在Python中return和finally共同存在的坑,以及填坑经验,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 初识 return 相信每一个用过Python函数的童鞋, 肯定会用过return...
Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据
### Java的throw和return 在Java编程语言中,`...综上所述,`throw`和`return`是Java中非常重要的控制流结构,它们与`finally`块之间有着紧密的联系。正确理解和运用这些概念对于编写健壮可靠的Java程序至关重要。
语法为:return 表达式; 语句结果函数的执行,返回调用函数,而且把表达式的值作为函数结果返回出去 ②返回控制无函数结果 语法为:return; 在大多数情况下,为事件处理函数如果让其返回false,可以防止默认的事件...
从结果可以看到,finally 块中的 return 语句会覆盖 try 块中的 return 语句,try 块中的 return 语句就不能返回了。 finally 语句是在 try 的 return 语句执行之后,return 返回之前执行的。 finally 块中的 ...
### 51单片机Return用法详解 #### 引言 在51单片机编程过程中,`return`关键字的正确使用对于确保程序逻辑的准确性和效率至关重要。本文将详细探讨51单片机中`return`的两种常见用法,并通过具体的代码示例来分析这...
try-catch-finally语句是Java语言中一种常用的异常处理机制,当程序在执行过程中出现异常时,可以使用try-catch-finally语句来捕获和处理异常。下面将详细介绍try-catch-finally语句的使用方法和注意事项。 一、try...
1. **返回值**:如果 `finally` 块包含 `return` 语句,那么它将覆盖 `try` 或 `catch` 块中的任何 `return` 语句。这意味着最后的返回值是由 `finally` 块决定的。 2. **跳转语句**:即使使用了 `break`、`...
在Java编程语言中,异常处理机制是...当两者同时存在时,`finally`块的代码总是先执行,但最终的返回值由最后遇到的`return`语句决定。在编写代码时,理解这种行为可以帮助避免意外的程序行为,并确保程序的健壮性。