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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊永标 中级黑马   /  2013-4-9 17:12  /  2120 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.concurrent.Callable;

  2. public class Hello {
  3.         public static void main(String[] args) {
  4.                 System.out.println(tryTest());

  5.         }
  6.         public static String tryTest(){
  7.                 String s=null;
  8.                 try {
  9.                         s="aa";
  10.                         return s;
  11.                 } finally {
  12.                         s="bb";
  13.                 }
  14.         }
  15. }
复制代码
为什么finally修改的值不会影响到返回值呢?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

5 个回复

倒序浏览
没返回,finally里加个return s。
  1. public class Temp {
  2.         public static void main(String[] args) {
  3.                 System.out.println(tryTest());

  4.         }
  5.         public static String tryTest(){
  6.                 String s=null;
  7.                 try {
  8.                         s="aa";
  9.                         return s;
  10.                 } finally {
  11.                         s="bb";
  12.                         return s;
  13.                 }
  14.         }
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你的代码貌似不能正常运行吧,这是有错误的,java规定,一个try后面必须至少接一个catch,可以不接finally,但是最多只能由一个finally,你的程序没有catch块,怎么能正常运行呢?剩下的事情楼上都说了,就是因为你的try里面已经写了return,当程序遇到return时,就会返回return后的变量的值,并且跳出函数,你的程序try中的return前没有错误,所以可以正常运行到return,这时函数中的剩余代码就不执行了

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
我用Eclipse里的Debug功能试了下,执行到return语句时没有直接返回,而是先去执行了finally里的语句,最后在返回来执行return s语句,至于finally修改的值不会影响到返回值,可能是在第一次执行到return s时,程序已经在内存里把return s(这时的s='aa')挂起来了,等到执行完finally里的语句时直接返回;

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报

  1. public class FinnallyDemo {
  2.         public static void main(String[] args) {
  3.                 System.out.println(tryTest());

  4.         }
  5.         public static String tryTest(){
  6.                 String s=null;
  7.                 try {
  8.                         s="aa";
  9.                         return test(s);

  10.                 } finally {
  11.                         s="bb";
  12.                                                 System.out.println("执行了finally");
  13.                                                 return s;//若这个return s没有,则不会覆盖s的值,还是原来的值
  14.                 }       
  15.         }
  16.                 public static String test(String s){
  17.                         System.out.println("test :");       
  18. return s;
  19.                 }
  20. }
复制代码
执行过程分析:
1.try语句块,return test(s),则调用test()方法
2.test()执行后返回s,返回值s保存在一个临时区域里
3.执行finally语句块。若finally语句有返回值,则此返回值将替换掉临时区域的返回值
4.将临时区域的返回值送到上一级方法中。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
内存中是这样的
执行 return 的时候会在内存中有个returnValue 存储 返回值
s="aa";
return s;
这时returnValue 值已经是aa,但是还要执行finally语句中的语句,执行完后 s的值是bb,但是返回的是还是returnValue 所以是aa
可以参考对比2楼的例子,2楼中在
finally {
                        s="bb";
                        return s;
                }
此时returnValue 变为bb,再返回,这时try中的return就不在运行

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马