JAVA中try catch finally执行顺序

1try-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

 

2return的执行,

一、如果finally{}块中有return语句,只执行finally{}块中的return语句;

二、如果finally{}块中没有return语句,如果try{}有异常,则返回catch{}中的return语句,不然执行try{}return语句。

 

扫描二维码关注公众号,回复: 1588829 查看本文章

情况1

try{}catch(){}finally{} return;

显然程序按顺序执行。

情况2:

try{ return;}catch(){} finally{} return;

程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行tryreturn;finally块之后的语句return,因为程序在try中已经return所以不再执行。

情况3:

try{ } catch(){return;}finally{} return;

程序先执行try,如果遇到异常执行catch块,有异常:则执行catchreturn之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。无异常:执行完tryfinallyreturn

情况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{ 
释放资源的代码;
}

猜你喜欢

转载自blog.csdn.net/qq_29569183/article/details/79217848