黑马程序员技术交流社区

标题: finally 和 return 的一道试题 [打印本页]

作者: 2528870651    时间: 2014-3-30 00:10
标题: finally 和 return 的一道试题
本帖最后由 2528870651 于 2014-3-30 00:15 编辑
  1. 题目是: 问下列代码的结果
复制代码


class ExceptionTest
{
        public static void main(String[] args)
        {
                int n = fun(2);
                System.out.println("打印fun()函数返回的n值=  "+n);
        }
        public static int fun(int i)
        {
                try
                {
                        int m= i/0;
                        return i++;
                }
        
                catch (ArithmeticException e)
                {
                        System.out.println("异常信息:"+e);
                        System.out.println("catch 中的i = "+i);
                        return i+3;                  }
               
                finally
                {
                        i++;
                        i++;
                        System.out.println("finally 执行  "+i);
                        return i+8;  
                }
        }
}
  1. class ExceptionTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int n = fun(2);
  6.                 System.out.println("打印fun()函数返回的n值=  "+n);
  7.         }
  8.         public static int fun(int i)
  9.         {
  10.                 try
  11.                 {
  12.                         int m= i/0;
  13.                         return i++;
  14.                 }
  15.         
  16.                 catch (ArithmeticException e)
  17.                 {
  18.                         System.out.println("异常信息:"+e);
  19.                         System.out.println("catch 中的i = "+i);
  20.                         return i+3;   //返回的是 2+3, 而不是finally中对i的赋值再来加上3,
  21.                                                         //finally中对i的操作,不会影响此时catch中的return i+3

  22.                 }
  23.                
  24.                 finally
  25.                 {
  26.                         i++;
  27.                         i++;
  28.                         System.out.println("finally 执行  "+i);
  29.                         //return i+8;   //如果这里没注释
  30.                                                         //这里会返回12,而不会去返回catch中的  return i+3
  31.                 }
  32.         }
  33. }
复制代码



作者: 唐僧踏歌    时间: 2014-3-30 00:47
亲,说实话没看懂你的疑问是什么呢。
就像你上面注释的那样,如果finally 块那里把“return i+8”变成注释,那n的值为5,没有的话n的值为12;

程序到了int m= i/0;那里就产生了java.lang.ArithmeticException异常,然后找到catch块进行异常处理,最后进入一定要运行的finally块,虽然catch/finally都有return i值,但是finally语句块较后运行,把catch返回的值给覆盖了。
作者: zhangbingyuan    时间: 2014-3-30 10:21
本帖最后由 zhangbingyuan 于 2014-3-30 10:26 编辑

首先分析下程序的执行顺序:
1,由于"int m = i/0"发生了除数为o的算数异常,所以在try代码块中,这条语句之后面的所有代码是不会执行到的。
2,catch捕获异常,开始异常处理操作:打印异常信息,输出catch中的i的值,但是要注意,如果catch块中有return语句,而且还有finally代码块的话 ,这个return语句的返回值,会等到到执行完finally中的代码之后再返回。
3,执行两次“i++”操作,打印出i的值为4。然而finally中出现了return语句,程序提前返回,这是就会打印出fun()函数的值为12.

执行的顺序就是这样。需要注意的是,如果这个程序里,finally没有return语句的话,这个程序的返回值会是5,因为上面我说过,catch块中的的语句都是会优先于执行的,包括return语句,只是返回值暂存起来了,没有返回而已。也就是说执行完catch块中的代码后,不管finally块中再对i执行何种操作,这个程序的返回值就已经确定了。 只不过,这里finally块中出现了return语句,让程序提前返回了而已。

恩,我的理解就是这样了,希望可以帮到你
作者: 2528870651    时间: 2014-3-30 13:06
zhangbingyuan 发表于 2014-3-30 10:21
首先分析下程序的执行顺序:
1,由于"int m = i/0"发生了除数为o的算数异常,所以在try代码块中,这条语句 ...

哥们真心感谢你, 看到这个题目的答案后,说实话有点晕。
你的解释很好,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2