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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-12 23:47  /  1356 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 2012-9-13 07:26 编辑

class   Exceptions{
        public String getMsg(){
                String msg = "ok";
                try {
                        return msg;
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        msg="finally";
                        System.out.println("进到finally语句块:"+msg);
                }
                return msg;
        }
                public static void main(String[] args) {
                System.out.println(new Exceptions().getMsg());
        }
}
按道理说以上程序会先执行finally语句块,再return try语句块,而执行finally语句块后此时变量msg的值会变成finally,而我们return过后自然应该是打印的
进到finally语句块finally
finally
但是结果却是
进到finally语句块finally
ok
请问这是为什么?

评分

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

查看全部评分

4 个回复

倒序浏览
  1. class Exceptions{
  2.         public String getMsg(){
  3.         String msg = "ok";
  4.         try {
  5.                 return msg;               
  6.         } catch (Exception e) {
  7.                 e.printStackTrace();
  8.         }finally{
  9.                 msg="finally";
  10.             System.out.println("进到finally语句块:"+msg);
  11.         }
  12.         return msg;                        //这里的msg没有执行
  13.         }
  14.         public static void main(String[] args) {
  15.                 System.out.println(new Exceptions().getMsg());
  16.         }
  17. }
  18. /*
  19. 程序到try语句块时,这里的msg="ok",读到return msg时,如果有finally,
  20. 会进入finally执行,此时msg="finally",打印输出语句:进到finally语句块:finally
  21. 之后程序返回,返回的msg到主函数打印输出:ok
  22. */
复制代码

评分

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

查看全部评分

回复 使用道具 举报
正是楼上兄弟说的那样的一个流程
回复 使用道具 举报
按道理说以上程序会先执行finally语句块,再return try语句块
    楼主错在这句话,实际上是先执行了try中的return语句再到finally中执行的,这里比较特殊的是return在退出函数之前其他部分不读,但是必须读finally{}。
    所以是try中的return返回了"ok",然后finally中的msg="finally".

我改写了下楼主的代码
        class   Exceptions{
        public String getMsg(){
                String msg = "ok";
                try {
                        return msg;                                         //这里返回了msg是"ok"
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        msg="finally";
                                                                          

                System.out.println("进到finally语句块:"+msg);
                         return msg;                                           //这里返回的msg是"finally"
                }
                //return msg;
        }
                public static void main(String[] args) {
                System.out.println(new Exceptions().getMsg());
        }
}

结果是
进到finally语句块:finally
finally

评分

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

查看全部评分

回复 使用道具 举报
楼主:
当运行时,会先执行主函数,主函数有一个new Exceptions().getMsg(),说明调用Exceptions中的getMsg方法,
所以到Exceptions中执行getMsg,先从try开始执行,并不是先执行finally,finally语句是一定要执行的,但不一
定会最先执行,执行try语句有return语句说明返回数值,返回值类型为String,返回值为msg,这时msg为"ok",
主函数调用的是这个函数,而这个函数返回msg="ok",所以主函数打印"ok"
try语句中并没有抛出异常,所以catch语句不执行
执行finally语句,这时msg被重新赋值为"finally",所以打印语句打印的是"进到finally语句块:finally"
最后的return并不执行,因为前面已经return过了

下面这种情况在try中抛出异常,它的return执行不到,会执行最下面的return,结果就是你写的
进到finally语句块finally
finally
class   Exceptions
{
    public String getMsg()
{
        String msg = "ok";
        try
  {
   if(msg=="ok")
   throw new Exception();
            return msg;
        }
  catch (Exception e)
  {
            // TODO Auto-generated catch block
           e.printStackTrace();
         }
   finally
   {
              msg="finally";
              System.out.println("进到finally语句块:"+msg);
         }
                return msg;
     }
     public static void main(String[] args)
     {
                System.out.println(new Exceptions().getMsg());
        }
}

评分

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

查看全部评分

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