黑马程序员技术交流社区

标题: 不太明白这东西 [打印本页]

作者: 黄杨    时间: 2013-2-6 17:46
标题: 不太明白这东西
public static int test() {
                try {
                        System.out.println("");
                        return 1;
                } catch (Exception e) {
                        e.printStackTrace();
                        return 2;
                }finally{
                        return 3;
                }
               
        }


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


作者: 朱玉玺    时间: 2013-2-6 18:03
1,虽然你使用了处理异常的语句,但个方法其实不会发生异常,也就是说,catch中的代码永远不会执行,所以就看不到return 2喽。
2.当读到return 1时,本来应该返回1,但你有finally,这导致return 1 执行前,它先判断有没有finally,有则先执行finally里的语句,然后再return 1;
3.因为你finally里中已经有return 3了,它执行完后,方法已经结束了,所以try中return 1就没有执行到。
作者: 李洪因    时间: 2013-2-6 19:08
在try语句中写入我们准备要尝试运行的代码,在运行中try语句只负责抛出运行代码时发生的异常。
在catch语句中我们写入的是对try语句运行中抛出异常的处理代码,catch语句需要传入异常类型作为参数,一旦catch捕获对应类型的异常就执行catch中的代码。在一个try语句后面可以跟多个catch语句,对try语句中抛出的异常进行针对性的处理。但是要注意try语句中产生的是异常还是错误。finally语句主要进行的是扫尾工作,无论try语句中是否抛出异常,都执行finally中的代码。例如在try语句中抛出了一个异常,被一个catch语句捕获,首先执行catch中的代码,执行完毕后转入finally语句中执行其中代码。
在该程序中有finally所以先执行,当执行玩finally程序就结束啦;
作者: 王国伟.    时间: 2013-2-7 20:31
本帖最后由 王国伟. 于 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 语句。
作者: 祝文丞    时间: 2013-2-7 20:54
1.2都被return返回啦。。
作者: 冯佩    时间: 2013-2-7 23:21
return是一结束标记,当读到return时,方法就会结束,但是如果方法中有finally的话,程序会读完finally中的代码再返回来读return,但是上述代码中的finally中有return,故方法在读到finally的return就会结束,所以不会再返回去读先前的return,而catch代码块中的代码则是在接收到异常时才会执行。




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