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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 何伟 于 2013-1-13 23:29 编辑

  1. public class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int c = fun();
  6.                 System.out.println("c="+c);
  7.         }
  8.         public static int fun()
  9.         {
  10.                 int i = 1;
  11.                 try
  12.                 {
  13.                         return ++i;
  14.                 }finally
  15.                 {
  16.                         ++i;
  17.                         System.out.println("i="+i);
  18.                 }
  19.         }
  20. }
复制代码
finally不是在return的之前执行的么?可是结果好象不太对?
i是先打印的说明finally是先执行的,但是i的值怎么变为3了?
而c的值怎么又变回2了?
谁给解释下

QQ截图20130113232228.png (23.99 KB, 下载次数: 228)

执行结果

执行结果

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
分析:
一、finally是java异常处理机制的一个关键字,
      它的作用是:不论是否产生异常,此代码块中的语句都会被执行到,
      try块中执行完毕之后,会转入到finally语句块中。
      在try块中已经改变了i的值(为2),在finally里再次改变了i的值(为3),
      自然打印出的是i=3;
二、return表示的是这个方法结束,并返回一个值,此时它的值为2,在main函数中
      自然打印的是c=2,
三、i++:表示的是先运算后,再自加
      ++i:表示的是先自加,再参与运算。
可以看一下java的异常捕获机制,可能对你有帮助。

点评

请尽快改名  发表于 2013-1-14 10:58

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
在try语句中,在执行return语句时,要返回的结果其实已经准备好了,就在此时,程序转到finally执行了。

在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果,

因此,即使finally中对变量x进行了改变,但是不会影响返回结果。

换言之 finally里面操作了的是已经retun后的值!

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
一、如果try catch finally块均无return则执行最后finally外的return;
如果try catch finally中任何一个有return则最后finally外的return不再执行;

二、只要finally块中有return则try或catch中的return不再执行.
总结:任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
建议楼主看下我的博客,关于这个问题写的非常详细
www.cnblogs.com/bin-study/

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张云杰 于 2013-1-14 19:21 编辑

return什么时候写?? 这个还是要根据你的代码来定的,

当你什么时候需要return 就写return,  

try{  return "这里也可以"}
cath{ return " 这里也可以"}
finally{"这里 依旧可以.."},

执行的话, finally 不管你在有没有异常 , finally 里的语句 是必须执行的一个语句, 所以 先计算 finally 的语句

所以代码的执行顺序是这样的, int i =1;  ++i , i 等于2, return,  由于finally .. 执行下去, i = 3,  这是第1个打印,

然后c的值是因为第一次++i 的时候被return 这时候 i 等于=2... 于是打印出第2个值 c = 2;

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报

public class Test
{
        public static void main(String[] args)
        {
                int c = fun();//此时c已经是2,由于被调用函数还没有执行完,所以没有执行下条语句打印
                System.out.println("c="+c);//被调用函数执行完,执行这条语句
        }

        public static int fun()
        {
                int i = 1;
                try
                {
                        return ++i;//先执行这条语句,运行到这里i已经是2,并且返回给调用函数
                }finally
                {
                        ++i;
                        System.out.println("i="+i);//这里i是3,并且打印
                }
        }//被调用函数,执行完
}

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
何伟 中级黑马 2013-1-14 22:26:16
7#
张云杰 发表于 2013-1-14 18:27
return什么时候写?? 这个还是要根据你的代码来定的,

当你什么时候需要return 就写return,  

是不是可以这样理解,执行到try的return时  main 函数已经拿到try中i的值?
回复 使用道具 举报
return是在finally执行后才返回的,且在finally无法改变返回值
回复 使用道具 举报

  1. public class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 //在执行这句时,同时执行了finally语句
  6.                 int c = fun();
  7.                 System.out.println("c="+c);
  8.         }
  9.         public static int fun()
  10.         {
  11.                 int i = 1;
  12.                 try
  13.                 {
  14.        [color=Red]         //++I是i先加1再return,自然此时i=2      [/color]  
  15.                 return ++i;
  16.                 }finally
  17.                 {
  18.                         //这时候。继续自加,于是i=3
  19.                         ++i;
  20.                         System.out.println("i="+i);
  21.                 }
  22.         }
  23. }
复制代码
这个已经不是什么先执行后执行的问题了。而是有finally就必然执行,在执行int i = fun()的同时已经执行finally语句了,然后才有后面的System.out.println.......
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马