try、catch&finally的执行顺序

这篇文章主要讨论的是try、catch、finally模块的执行顺序。先看下面一个例子:
 
public static String doTrySeq(){
  
  try {  
            System.out.println("try");          // 1
            int i = 12/0;                             // 2
            //System.out.println("It's the next step after throwed exception");   // 8
            return "try";                             // 3
        }catch(Exception e){
         System.out.println("catch");        // 4
            return "catch";                         // 5
        }
  finally {  
            System.out.println("finally");     // 6
            return "finally";                         // 7
        }  
        //return "out";                               // 9
 }
 
public static void main(String[] args) {
  System.out.println("where return? " + doTrySeq());
}
 
 
输出结果:
try
catch
finally
where return? finally
 
 执行顺序如下:
1)先执行1、2,在2处抛出异常,跳到catch代码块(此时跳过了3)
2)执行4、5。这里很多人认为执行return,所以直接退出并返回值。但事实并不是的,在java中,try、catch,无论执行了什么代码,最后都必须进入finally代码块。(当然,你如果用 System.exit(0);这个是系统强制退出,没辙,肯定会退出去,不会执行下面的finally)
3)执行6、7,执行到7时,这时finally代码已经执行完,本应该跳回try继续下一步,但因为finally代码块中有return,所以退出方法并返回了“finally”
 
 

下面将注释catch和finally中的return,即注释掉5、7,取消8、9的注释
执行结果为:
try
catch
finally
where return? out
 
在执行2时,抛异常,这时跳到catch代码块,再执行finally代码块,之后跳出方法,执行9
可以看出,try中如果抛异常,程序会跳出对应的try-catch-finally模块,而出现异常的代码句下面的代码将不会被执行

猜你喜欢

转载自wsqwsq000.iteye.com/blog/1120656