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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李方哲 黑马帝   /  2011-9-27 03:10  /  2425 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[code=java]public class Test {  
    public static void main(String[] args) {  
        System.out.println(test());  
    }  
  
    public static String test() {  
        try {  
            System.out.println("try block");  
            return test1();  
        } finally {  
            System.out.println("finally block");  
        }  
    }  
  
    public static String test1() {  
        System.out.println("return statement");  
        return "after return";  
    }  
} [/code]
经过运行,结果是:
try block
return statement
finally block
after return

为什么finally block会在after return之前出现呢,

评分

参与人数 1技术分 +1 收起 理由
admin + 1 看看大家的回答,明白了?

查看全部评分

5 个回复

倒序浏览
黑马网友  发表于 2011-9-27 07:17:46
沙发
李芳哲同学你好[code]        public static void main(String[] args)
        {  
        System.out.println(test());  
        }  

        public static String test()
        {  
            try {  
                   System.out.println("try block"); //1
                   return test1();  
                }
             finally
             {  
                 System.out.println("finally block");  //3
             }  
        }  
        public static String test1()
        {  
             System.out.println("return statement");  //2
             return "after return";  //4
        }  
        }[/code]我们仔细看一下
1首先System.out.println(test());  
2先执行test(),好,那么System.out.println("try block"); //1 没有问题
3接着test()里有return test1();     这就要先执行test1()里的System.out.println("return statement");  //2
然后将返回值return "after return";  //4交给test(),rest()的返回值最终是由System.out.println(test());  打印的!!!
然而此时 test()已经结束(因为将值返回)函数运行完毕,
执行
finally
             {  
                 System.out.println("finally block");  //3
             }  
最后才执行的主函数System.out.println(“!返回值!"after return"”);

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
[code=java]public class TryFinally {
        public static void main(String[] args) {
                System.out.println(test());//1、先执行
                test();//改成这样他就没有最后的after return了
        }

        public static String test() {
                try {
                        System.out.println("try block");//1.1
                        return test1();//1.2
                } finally {
                        System.out.println("finally block");//1.3
                }
        }

        public static String test1() {
                System.out.println("return statement");//1.2.1
                return "after return";//1.2.2其实这个是返回给1的,就是说是test()的最终返回结果。
        }
}[/code]
[ 本帖最后由 ila123 于 2011-09-27  09:57 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-27 10:57:22
板凳
因为在这个代码中,如前面2位所说的,在运行 test()会返回“after return”,但是返回时 test()方法的finally语句并还没运行完,所以便先运行finally语句还接着执行调用test()方法的语句

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-27 12:18:04
报纸
我说下我的看法。
当方法运行完毕后,方法的栈内存会被销毁,方法里的内容就不会被再次执行,因为只要方法一返回,方法就会释放其所占用的 cpu资源,线程回到主调函数的执行,该方法被销毁。方法被销毁后,还怎么能占用cpu资源,执行自己的代码呢?
所以,只能是:finally语句块是再方法返回 前被执行的。就是 方法 把它 的返回值往外抛之前执行。就像异常里的throw一样,必须在抛出异常前执行finally语句块。
看下面简单代码:
int a = m();  int m(){try{ return 1;}catch(Exception e){}finally{System.out.println("111");}
就是finally语句块里的输出语句会在虚拟机给 a 赋值前执行。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
楼主的问题:为什么finally block会在after return之前出现呢?

答:先赞楼主一个,问得好。在使用try catch的时候,finally中的语句块是无论如何也要执行的,那么就涉及到return的语句该怎么办呢?return返回值总是在最后执行的,那么return语句在finally语句之前呢?按照jvm运行的流程是这样的:如果碰到上面的情况,是要先执行finally,执行完后再进行return。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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