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

© 疯疯疯疯疯子 中级黑马   /  2015-8-13 21:10  /  408 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 疯疯疯疯疯子 于 2015-8-13 23:08 编辑

public class Test5
{
        
        static int hanshu()
        {
                        int x=0;
                        try
                        {
                                System.out.println("try run"+x);
                                
                                return x++;
                        }
                        finally
                        {
                                x++;
                                System.out.println("finally run"+x);
                        }
                }
        public static void main(String[] args)
        {
                hanshu();
        }

}

这个程序给我的结论是先return,然后finally
可是有些人(PS: 程序不一样)的结论怎么和我的不一样
输出的结果是try run0
                     finally run2
为什么会是2?是因为return x++运行玩了,所以x是1,然后到finally左边x又加了1,结果才出现了2吗?


9 个回复

正序浏览
先看这段代码,两个静态方法,MAIN方法和 hanshu()方法,
这两个方法随着Test5类的加载而加载,他们两个应该都在栈内存中,栈中的方法要用完就消失,不用完不消失,
所以在MAIN方法中不用用创建对象就可以直接调用静态成员hanshu()方法,
静态成员hanshu()方法的返回值是int型的,
在看静态成员hanshu()方法的方法体,int x=0 ,其中 x 是在内存中是地址值,地址值不变,初始化的值是0,
先明白return 是要结束这个静态成员hanshu()方法的并且还要返回值的,所以finally代码应该在return前执行
记住try.....finally语句中都有return,既有两个return,那么finally代码块中return将会覆盖别处的return,最终返回调用者是finally代码块中return的值,由于方法内部定义的变量都在栈中,当方法结束后,栈就被回收,方法体中的变量就不存在了,,因此return在返回时,不是直接返回变量的值,,而是复制一份,然后返回。
你可以把这个代码的MAIN方法中的代码改成这样,
int result = hanshu();
System.out.println(result);
你会发现最后return的值是2,那么finally代码块的输出在这个return的值是2的前面

以上所述,有前提是 这个 hanshu()方法是静态的,并且返回值是基本数据类型的。
回复 使用道具 举报
坚持努力,加油
回复 使用道具 举报
周博文 发表于 2015-8-13 23:08
按我写的1,2,3的顺序,当然是先运行return 了, 如果你不清楚先运行的是哪个的话,看返回的值就知道了 ...

对,问题就是这个,我认为是先return,可是别人说是到return的时候就跳转到finally,运行玩了finally之后再回去return,这就是我和别人讨论的

谢谢
回复 使用道具 举报
疯疯疯疯疯子 发表于 2015-8-13 23:05
现在问题是先运行return还是finally

按我写的1,2,3的顺序,当然是先运行return 了, 如果你不清楚先运行的是哪个的话,看返回的值就知道了,如果返回0,那就是先return , 如果返回2,就是先finally
回复 使用道具 举报
周博文 发表于 2015-8-13 21:50
这个程序的执行流程是这样的:
1.先执行try语句块中的语句,输出: try run 0
2.之后遇到了return 语句,ret ...

现在问题是先运行return还是finally
回复 使用道具 举报
这个程序的执行流程是这样的:
1.先执行try语句块中的语句,输出: try run 0
2.之后遇到了return 语句,return关键字的作用是将方法的返回值返回给调用者,然后结束这个方法,因此在
return x++; 执行完毕后,方法调用结束
3.finally语句块的特点是:该语句块中的语句在任何情况下都必须被执行,虽然方法调用已经结束了,但JVM仍然会执行finally中的语句,因此会在控制台打印出 i两次++后的值,即: finally run 2

这段代码的目的是在于说明try - catch - finally 中finally语句块的特点,即无论程序运行时是正常结束,还是捕获到异常,finally中的语句都会被执行,因此finally常被于在IO操作之后关闭资源。
回复 使用道具 举报
但还是会先执行finally的 你可以打个断点看一下 不是直接在try就return了 只不过finally没有起到作用而已
回复 使用道具 举报
还是局部变量的问题 如果finally里有return就直接取finally 如果finally不return 那么即便执行了finally 所有的值再返回try之后都失效了 你好好想想是不是这样的事
回复 使用道具 举报
finally在这里的作用是什么啊?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马