黑马程序员技术交流社区
标题: try,finally,return 还是疑惑,请教 [打印本页]
作者: 张小锋 时间: 2012-5-6 22:07
标题: try,finally,return 还是疑惑,请教
本帖最后由 张小锋 于 2012-5-6 22:09 编辑
书上说当有finally语句并且try中有return,在执行到return(还未执行)的时候,会先执行finally里面的内容,然后再执行行try中的return。
但下面就是有说明了什么呢?
public class Reflex {
public static void main(String[] args) {
System.out.println(textFun());
System.out.println("----------------------------");
System.out.println(textFun2());
}
static String textFun(){
String sign="null";
try {
System.out.println(sign="try"); 第一步执行
return sign="try return"; 第四步执行,所以返回值就是try return
} catch (Exception e) {
}
finally{
System.out.println(sign="finally"); 第二步执行
sign="finally return "; 第三步执行
}
return sign="Over";
}
static String textFun2(){
String sign="null";
try {
System.out.println(sign="try");
return sign; 此处不同的就是没有从新赋值
} catch (Exception e) {
}
finally{
System.out.println(sign="finally");
sign="finally return ";
}
return sign="Over";
}
}
打印:
try
finally
try return
----------------------------
try
finally
try
方法textFun2中的try中在执行return时候,虽然没有在return之后从新赋值,但return子后也应该sign="finally return "啊,为什么sign值又还原到第一步子后的值呢?
作者: 黄或俊 时间: 2012-5-6 23:04
finally语句是一定执行的,除非遇到System.exit();
当执行到try中的return时,此时需要将这条异常语句返回,但是又必须执行finally语句,所以return语句中先记录返回结果,然后再去执行finally中的语句,最后再将记录的结果返回
总结一点:
不管finally语句中对return中数据怎么改变,结果都不会变化
作者: 云惟桉 时间: 2012-5-7 00:33
楼主可以这么理解:
当在try语句中遇到了一个return以后,就相当于发生了一个中断,程序跳到中断处理部分执行。
而这里说的中断处理部分,就是finally语句,执行完后再回复到try中执行最后的return。
但是,中断就意味着变动,再去处理中断之前要保护现场,即把运算结果和相关数据保存起来(可以理解成数据压栈)
然后中断处理结束,就需要吧这些结果和数据都重新取出来,恢复现场(可以理解为数据出栈)。
因此,对于楼主遇到的问题,也可以这么理解了。中断的思想在硬件很常见,在try和finally之间就相当于发生了一次软中断。
个人理解,有什么不足还望指出。
作者: 马浩 时间: 2012-5-7 08:01
在try语句中,在执行return语句时,要返回的结果就已经准备好了,此时程序转到finally中执行了,在转去之前,try中先把要返回的结果存到不同于a的局部变量中去,执行完finally之后再取出返回结果,所以,即使finally中对变量a进行改变,也不会影响返回结果的
作者: 倪杭乘 时间: 2012-5-7 10:27
Retrun try;记住当前try值 finally运行不改变try的值
简单点就是变量的生命周期只在大括号内,return的try无法读到finally中的数值
作者: xiwangliujiao 时间: 2012-5-7 20:38
finally语句是一定执行的,除非遇到System.exit();
当执行到try中的return时,此时需要将这条异常语句返回,但是又必须执行finally语句,所以return语句中先记录返回结果,然后再去执行finally中的语句,最后再将记录的结果返回
总结一点:
不管finally语句中对return中数据怎么改变,结果都不会变化
当在try语句中遇到了一个return以后,就相当于发生了一个中断,程序跳到中断处理部分执行。
而这里说的中断处理部分,就是finally语句,执行完后再回复到try中执行最后的return。
但是,中断就意味着变动,再去处理中断之前要保护现场,即把运算结果和相关数据保存起来(可以理解成数据压栈)
然后中断处理结束,就需要吧这些结果和数据都重新取出来,恢复现场(可以理解为数据出栈)。
因此,对于楼主遇到的问题,也可以这么理解了。中断的思想在硬件很常见,在try和finally之间就相当于发生了一次软中断。
个人理解,有什么不足还望指出。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |