黑马程序员技术交流社区

标题: finally相关问题 [打印本页]

作者: Tesla时光    时间: 2012-9-10 00:27
标题: finally相关问题
本帖最后由 翁发达 于 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;   
  }

}
}
作者: 李菁    时间: 2012-9-10 00:55
finally里面的语句是一定会被执行的,但在finally之前,catch块中已经return了,
所以整个程序已经结束,main方法调用的get方法返回的是catch里面运算的结果。
作者: 杨习平    时间: 2012-9-10 01:00
本帖最后由 杨习平 于 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;
              
                            }
        }

}

作者: 吴通    时间: 2012-9-10 08:39
楼主:
首先我们知道类中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
  }
}
}





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