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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tesla时光 中级黑马   /  2012-9-10 00:27  /  1512 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 翁发达 于 2012-9-10 21:01 编辑

为什么下面这个结果是3?finally一定执行了,结果不是4吗?
class Test
{
public static void main(String[] args)
{
   System.out.println(get());
    }

public static int get()
{
  int x = 0;
  try
  {
    x += 1;
    throw new Exception();
  }
   catch (Exception e)
  {
    x += 2;
    return x;
  }
  finally
  {
   ++x;   
  }

}
}

评分

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

查看全部评分

4 个回复

倒序浏览
finally里面的语句是一定会被执行的,但在finally之前,catch块中已经return了,
所以整个程序已经结束,main方法调用的get方法返回的是catch里面运算的结果。
回复 使用道具 举报
本帖最后由 杨习平 于 2012-9-10 01:03 编辑

你得先知道:return是在finally执行后才返回的,且在finally无法改变返回值.
--------------------------------------------------------------------------
再来看看你的代码。这样子你就可能能看明白:
                      class Test
                  {
                public static void main(String[] args)
                {
                           System.out.println(get());
                  }

                        public static int get()
                        {
                          int x = 0;
                          try
                          {
                            x += 1;
                            throw new Exception();
                          }
                           catch (Exception e)
                          {
                            x +=4;
                           return x-1;//它的值是在finally执行之后才开始执行的                          
                        }
                          finally
                          {
                        System.out.println(++x);//在这里输出是为了让你看的清楚finally执行了,是在return之前。
                          }

                        }
                }
===========================
如果还是不懂就看看这个例子:
        
public class Test2 {
        public static void main(String[] args) {
                // 调用Re()方法并打印输出
                int num = Re();
                System.out.println(num);
        }

        // 定义一个静态的Re()方法
        public static int Re() {
                // 先定义一个int x:并赋初始值
                int x = 10;
                // 异常处理
                try {
                        System.out.println("try");
                        x = 20;
                        // 可能抛异常
                        throw new Exception();

                } catch (Exception e) {
                        System.out.println("catch");
                        // 返回x,在这里编辑器会记住这个数值为20
                        return x;
                } finally {
                        System.out.println("finally");
                        // 编辑器执行到这儿是不会影响到之前的返回值,依然返回20
                        x = 30;
              
                            }
        }

}

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼主:
首先我们知道类中get方法为成员方法,我们知道方法分为有返回值类型的
和没有返回值类型的,而我们看到get方法前面为int返回值类型,所以有
返回值类型的方法一定要有return语句来返回一个数值,所以当执行到catch
语句里面的return语句时表示这个方法的返回值已经产生,而finally语句只是
改变x的值,并没有改变返回的值。
如果我们在finally中再调用x的话,就是4   
请看下面的代码:
class Test
{
public static void main(String[] args)
{
   System.out.println(get());   //调用get方法,值为return的x为3
    }
public static int get()
{
  int x = 0;
  try
  {
    x += 1;
    throw new Exception();
  }
   catch (Exception e)
  {
    x += 2;
    return x;
  }
  finally
  {
   ++x;
   System.out.println(x);   //值为4
  }
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马