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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄杨 中级黑马   /  2013-2-6 17:46  /  1413 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static int test() {
                try {
                        System.out.println("");
                        return 1;
                } catch (Exception e) {
                        e.printStackTrace();
                        return 2;
                }finally{
                        return 3;
                }
               
        }


为什么这句话最后返回的只有一个3? 1和2跑哪去了?

点评

关于return返回值在finally中的现象,论坛中已有很多很给力的贴子,可以自己搜下,更有助理解。  发表于 2013-2-6 19:38

评分

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

查看全部评分

6 个回复

倒序浏览
1,虽然你使用了处理异常的语句,但个方法其实不会发生异常,也就是说,catch中的代码永远不会执行,所以就看不到return 2喽。
2.当读到return 1时,本来应该返回1,但你有finally,这导致return 1 执行前,它先判断有没有finally,有则先执行finally里的语句,然后再return 1;
3.因为你finally里中已经有return 3了,它执行完后,方法已经结束了,所以try中return 1就没有执行到。

评分

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

查看全部评分

回复 使用道具 举报
在try语句中写入我们准备要尝试运行的代码,在运行中try语句只负责抛出运行代码时发生的异常。
在catch语句中我们写入的是对try语句运行中抛出异常的处理代码,catch语句需要传入异常类型作为参数,一旦catch捕获对应类型的异常就执行catch中的代码。在一个try语句后面可以跟多个catch语句,对try语句中抛出的异常进行针对性的处理。但是要注意try语句中产生的是异常还是错误。finally语句主要进行的是扫尾工作,无论try语句中是否抛出异常,都执行finally中的代码。例如在try语句中抛出了一个异常,被一个catch语句捕获,首先执行catch中的代码,执行完毕后转入finally语句中执行其中代码。
在该程序中有finally所以先执行,当执行玩finally程序就结束啦;

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 王国伟. 于 2013-2-7 20:42 编辑

一般来说 finally 块区域中的代码都是不能够通过重新赋值的方式来改变 try 区域和catch中 return 语句的返回值。但是有一种情况例外,那就是在 finally 内部使用 return 语句。
class test
{
        public static void main(string[] args)
        {
                int a=test();
                system.out.println(a); //输出的结果是3
        }
        public static int test()
        {
                try
                {
                        string s=null;
                        s.substring(0,1);
                        return 1;
                }
                catch(exception e)
                {
                        return 2;
                }
                finally //如果没有finally,则输出2
                {        
                        return 3;
                }
        }
}

finally 内部使用 return 语句后,它影响(覆盖了) try 区域和catch中 return 语句的返回值。
之所以出现这种现象的真正原因是,由于 finally 区域中的代码先于 return 语句被执行,但是,如果此时在 finally 内部也有一个 return 语句,这将会导致该函数直接就返回了,而致使 try 和catch作用域中的 return 语句再也得不到执行机会(实际就是无效代码,被覆盖了)。
强烈建议不要在 finally 内部使用 return 语句。

评分

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

查看全部评分

回复 使用道具 举报
1.2都被return返回啦。。
回复 使用道具 举报
return是一结束标记,当读到return时,方法就会结束,但是如果方法中有finally的话,程序会读完finally中的代码再返回来读return,但是上述代码中的finally中有return,故方法在读到finally的return就会结束,所以不会再返回去读先前的return,而catch代码块中的代码则是在接收到异常时才会执行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马