1、try-catch-finally执行顺序:
一、执行try{}块;
二、如果try{}块有异常产生,执行catch{}块;
三、无论有没有异常都要执行finally{}块,这里可以看出只要finally中有return,必然返回finally{}中的return。
四,只有一种情况下finally不会执行,就是遇到System.exit(0)这句代码代表退出JVM
如:
try{
语句1;
语句2;
语句3;
}catch(){
语句4;
}
finally{
语句5;
}
当语句1抛出异常时,执行顺序:1 4 5
当语句2抛出异常时,执行顺序:1 2 4 5
当语句1、2、3都没有异常时,执行顺序:1 2 3 5
2、return的执行,
一、如果finally{}块中有return语句,只执行finally{}块中的return语句;
二、如果finally{}块中没有return语句,如果try{}有异常,则返回catch{}中的return语句,不然执行try{}中return语句。
情况1:
try{}catch(){}finally{} return;
显然程序按顺序执行。
情况2:
try{ return;}catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:
try{ } catch(){return;}finally{} return;
程序先执行try,如果遇到异常执行catch块,有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。无异常:执行完try再finally再return。
情况4:
try{ return;}catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
情况5:
try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
情况6:
try{ return;}catch(){return;}finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出。无异常:则再执行finally块,因为finally块中有return所以提前退出。
最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。
3.常见的try块应用场景:
try块的三种组合方式:
第一种: 比较适用于有异常要处理,但是没有资源要释放的。
try{
可能发生异常的代码
}catch(捕获的异常类型 变量名){
处理异常的代码
}
第二种:比较适用于既有异常要处理又要释放资源的代码。
try{
可能发生异常的代码
}catch(捕获的异常类型 变量名){
处理异常的代码
}finally{
释放资源的代码;
}
第三种: 比较适用于内部抛出的是运行时异常,并且有资源要被释放。
try{
可能发生异常的代码
}finally{
释放资源的代码;
}