黑马程序员技术交流社区

标题: try{}catch()finaly{}代码如何执行的 [打印本页]

作者: 袭喜悦    时间: 2013-2-16 00:15
标题: try{}catch()finaly{}代码如何执行的

  1. <P>class  ExceptionDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5.   Demo d = new Demo();</P>
  6. <P>  try
  7.   {
  8.    int x = d.div(4,-1);
  9.    System.out.println("x="+x);
  10.     return;//<FONT color=red>在try代码快里面加入一个return语句</FONT>
  11. </P>
  12. <P>  }
  13.   catch (FuShuException e)
  14.   {
  15.    System.out.println(e.toString());
  16.    return;
  17.   }
  18.   finally
  19.   {
  20.    System.out.println("finally");
  21.   }</P>
  22. <P>
  23.   System.out.println("over");
  24. }
  25. }</P>
复制代码
在try代码块里加入return语句,finally代码块里的语句还会执行吗?什么时候执行?在return语句之前还是之后?

作者: 王钊    时间: 2013-2-16 11:22
会执行,在return语句之前执行,执行完finally块之后再执行return。
除非在try块、catch块中调用了退出虚拟机的方法(System.exit(参数)),否则在执行怎样的代码,出现怎样的情况,异常处理的finally块总会被执行。
另外,在通常情况下,不要在finally块中使用如return或throw等导致方法终止的语句,否则会导致try块、catch块中的return、throw语句失效。
作者: 李培根    时间: 2013-2-16 12:20
张孝祥老师解答过这个问题,可以说是在return中间执行,执行到return后会开辟空间将结果存入到内存空间中。然后执行finally中的代码,执行代码完毕后返回内训空间中所存的值。
public class FinallyDemo {

        public static void main(String[] args) {
                System.out.println(get1());//打印结果1
                System.out.println(get2());//打印结果2
        }

        private static int get2() {
                try {
                        return 1;
                } finally {
                        return 2;
                }
        }

        private static int get1() {
                int x = 1;
                try {
                        return x;
                } finally {
                        x = 5;
                }
        }

}

作者: 陈科宇    时间: 2013-2-16 12:31
朋友,之前已经有人问过这个问题。finally确实是奇葩,在catch块或try块里加入return语句,finally里的语句依然会执行。而且原则是一旦在try块或catch块里遇到return关键字,会先去执行finally里的内容。如果此时finally也有return那么try和catch块里的return不再拥有执行机会。有一种情形例外,那就是在try块或catch块里加入了System.exit(0)的语句,finally再神通广大,也无机会执行。
作者: 李洪因    时间: 2013-2-16 13:04
try
{
执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}
作者: 李大强    时间: 2013-2-16 13:29
关于此类问题的总结如下:

1、正常情况下:

当程序把try{}语句块内的代码执行完毕后,如果一直都没有错误,此时程序将跳过catch{}语句块,执行finally{}语句块内的代码;

2、当出现异常时

此时程序将不再执行try{}语句块内的内容,转而到catch{}语句块中寻找对应的异常处理方式,

这里需要声明的是catch{}语句块可以有多个,但排列的顺序要从小到大排,例如:如果最上面的的catch语句为(Exception e)的话,那么
下面的catch{}将不会执行!因为所有的异常都已经被“Exception”截获了!

当catch语句处理完异常以后,程序将再转到finally{}语句块执行!

3、更加特殊的

就算你try{}语句块中没有出现异常,而且加了“return”语句,当程序执行到此后依然会转去执行finally{}语句块

4、如果finally{}语句块中有return语句的话,try{}语句块中的return代码将不会被执行


5、特别的

当你在try{}或catch{}语句块中直接调用了System.exit(0)时,此时虚拟机将退出,finally{}才不会被执行!




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