A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张小锋 中级黑马   /  2012-5-6 22:07  /  2335 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张小锋 于 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值又还原到第一步子后的值呢?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

5 个回复

倒序浏览
finally语句是一定执行的,除非遇到System.exit();
当执行到try中的return时,此时需要将这条异常语句返回,但是又必须执行finally语句,所以return语句中先记录返回结果,然后再去执行finally中的语句,最后再将记录的结果返回
总结一点:
不管finally语句中对return中数据怎么改变,结果都不会变化
回复 使用道具 举报
楼主可以这么理解:

当在try语句中遇到了一个return以后,就相当于发生了一个中断,程序跳到中断处理部分执行。
而这里说的中断处理部分,就是finally语句,执行完后再回复到try中执行最后的return。
但是,中断就意味着变动,再去处理中断之前要保护现场,即把运算结果和相关数据保存起来(可以理解成数据压栈)
然后中断处理结束,就需要吧这些结果和数据都重新取出来,恢复现场(可以理解为数据出栈)。

因此,对于楼主遇到的问题,也可以这么理解了。中断的思想在硬件很常见,在try和finally之间就相当于发生了一次软中断。
个人理解,有什么不足还望指出。
回复 使用道具 举报
在try语句中,在执行return语句时,要返回的结果就已经准备好了,此时程序转到finally中执行了,在转去之前,try中先把要返回的结果存到不同于a的局部变量中去,执行完finally之后再取出返回结果,所以,即使finally中对变量a进行改变,也不会影响返回结果的
回复 使用道具 举报
Retrun try;记住当前try值 finally运行不改变try的值
简单点就是变量的生命周期只在大括号内,return的try无法读到finally中的数值
回复 使用道具 举报
finally语句是一定执行的,除非遇到System.exit();
当执行到try中的return时,此时需要将这条异常语句返回,但是又必须执行finally语句,所以return语句中先记录返回结果,然后再去执行finally中的语句,最后再将记录的结果返回
总结一点:
不管finally语句中对return中数据怎么改变,结果都不会变化
当在try语句中遇到了一个return以后,就相当于发生了一个中断,程序跳到中断处理部分执行。
而这里说的中断处理部分,就是finally语句,执行完后再回复到try中执行最后的return。
但是,中断就意味着变动,再去处理中断之前要保护现场,即把运算结果和相关数据保存起来(可以理解成数据压栈)
然后中断处理结束,就需要吧这些结果和数据都重新取出来,恢复现场(可以理解为数据出栈)。

因此,对于楼主遇到的问题,也可以这么理解了。中断的思想在硬件很常见,在try和finally之间就相当于发生了一次软中断。
个人理解,有什么不足还望指出。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马