这篇文章主要讨论的是try、catch、finally模块的执行顺序。先看下面一个例子:
public static String doTrySeq(){
try {
System.out.println("try"); // 1
int i = 12/0; // 2
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 "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());
}
System.out.println("where return? " + doTrySeq());
}
输出结果:
try
catch
finally
where return? finally
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
catch
finally
where return? out
在执行2时,抛异常,这时跳到catch代码块,再执行finally代码块,之后跳出方法,执行9
可以看出,try中如果抛异常,程序会跳出对应的try-catch-finally模块,而出现异常的代码句下面的代码将不会被执行