本文主要是介绍关于return和finally的执行时机的一点小问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
国庆几天,闲的蛋疼,于是便找了一些以前学过的东西来敲,随后发现了一个小问题。
由于代码教简单,先现出代码:
package cn.lzj0927_cvte_question;
/**
* return 的用途:导致当前方法的退出,并返回那个值
* finally :无论异常是否被抛出,finally子句总能被执行
*/
public class TestTryFinally {
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int x =99;
try{
System.out.println("try"+x);
return x;
}
finally{
System.out.println("finally"+x);
x=8;
System.out.println("finally"+x);
}
}
}
运行结果如下:
try99
finally99
finally8
99
可以看见,在finally中x的值已被改变,可是输出的竟然是x改变之前的值。
test的执行顺序如下:
若try{}子句中有return,那么执行到return时,先不返回,先执行fianlly子句,再返回值。
仔细分析,可以发现,fianlly中改变的只是x在栈中的值,在返回时,变量指向的值并没有被改变。把test代码稍作修改:
public static int test2(){
int x =99;
int y =0;
try{
System.out.println("try"+x);
return x;
}
finally{
System.out.println("finally"+x);
x=y;
return x;
}
}
main中输出的便是y的值:0
可推测,在try中执行到return时,先把要返回的引用存到了某一地方,但未返回,当执行完finally时,便调用引用,返回引用所指向的堆中所存的值。因此,在finally中对基本数据类型变量的值的改变对返回值并没有影响,而对对象引用的改变就会对返回值有所影响。
后来我在finally中也加了一个return,输出的是x改变之后的值。可知finally中的return会覆盖try中的return,也就是说,若finally中有return,将直接返回,不会再执行try中的return。
这篇关于关于return和finally的执行时机的一点小问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!