昨天面试遇到一个问题,return与finally的执行顺序,并举例最后的返回值是否变化。发现自己很多基础知识不知道,或者只是看过一眼,自己还是太浮躁,没有静下心来学习。对于我这个半路出家的程序员,还有很多的路要走。希望自己一点一点的积累,不辜负自己的努力与梦想。不骄不躁,做好自己。
以下是自己整理的别人的文章,和自己的理解与实践。
一、return与finally的执行顺序:
参考博客http://blog.csdn.net/qj19842011/article/details/45675057
1)只有return这个返回值较清楚
2)当finally与return同时存在时,这里就体现了这两者的执行顺序,先执行return得到返回值,但是暂时不返回,找个地方先存起来,等finally执行完了再去将保存的值进行返回。具体保存到哪儿和怎么取的可以参考上面的,我没有深究。
所以我理解的返回顺序是先计算返回值,遇到return时将此时的值保存起来,等待finally执行完成,再返回刚刚保存的值。
二、关于返回值的问题
通过上面的返回顺序以及过程可以看出,返回值的改不改变区别于return时保存的那个值是否会在finally过程中发生改变。看了一些被人的总结,根据返回值的类型分两种情况:基本数据类型和引用数据类型(对象、数组、集合等)。
1)基本数据类型:
因为基本数据类型在保存的过程中,是直接保存的值,比如你的结果是5,那么那就将5暂时保存在某个地方,finally中的操作是找不到5的(我没想到怎去改变这个5),所以这种情况finally改变变量的值,也不会改变最会返回的值,因为它暂存的是一个具体的值,而不是变量本身。
public static int getA(){
int a=10;
try {
return a;
} finally {
a=12;
}
}
System.out.println(getA());//结果为10
2)引用数据类型
引用数据类型与基本数据类型不同之处在于,它保存的只是引用,你通过引用去找它的实际对象。所在在这个过程中别人完全可以改变你实际对象的值,等你再次去找的时候,已经发生了改变。所以可以导致返回值发生改变。
public static int getError(){
int a;
try {
a=10/0;
return a;
} catch (Exception e) {
a=13;
return a;
}finally {
a=12;
//return a;
}
}
System.out.println(getUser(12).getAge());//结果为18
三、关于别人讨论的在finally中存在return的问题
在finally中使用return的目的是为了防止抛异常以后不能返回值而在finally中进行返回值吗?我自己试了一下
public static int getError(){
int a;
try {
a=10/0;
return a;
} catch (Exception e) {
return 13;
}finally {
//return 12;
}
}
异常的话可以放到catch中处理赛,当然你在finally中返回也没错,也会返回12,但是我理解的finally一般是做一些资源的回收以及收尾工作,而异常的话可以给catch处理。
再然后如果不是因为异常呢
public static int getError(){
int a;
try {
a=10/1;
return a;
} catch (Exception e) {
a=13;
return a;
}finally {
a=12;
return a;
}
}
返回值为12,通过这两个例子结合开始那篇文章里面提到的return返回过程,我发现可能是因为只要执行return都会去进行一个暂存值的操作,然后会去取最后暂存的一个数据出来。但我还是无法理解为什么要放个return在finally中,等以后遇到再说吧。
以上就是我对这个问题的理解和收获,记录下来以供自己的学习,能力有限,以后再进一步完善吧。第一篇文章,给自己最好的鼓励吧。