0
点赞
收藏
分享

微信扫一扫

Java - try、catch、finally(包含 return)


一、结论

  1. 不管有没有出现异常,finally块中代码都会执行;
  2. 当try和catch中有return时,finally仍然会执行;
  3. finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
  4. finally中最好不要包含return,否则程序会提前退出,注意这里的finally return中的返回值不是try或catch中保存的返回值。

二、栗子

  1. try{} catch(){}finally{} return;
    Ps:显然程序按顺序执行。
  2. try{ return; }catch(){} finally{} return;
    Ps(无异常):程序执行try块中return之前(包括return语句中的表达式运算)代码;
    再执行finally块,最后执行try中return;
    finally块之后的语句return,因为程序在try中已经return所以不再执行。
  3. try{ } catch(){return;} finally{} return;
    Ps:程序先执行try,如果遇到异常执行catch块:
    有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return。finally外面的return代码不再执行。
    无异常:执行完try再finally再return.
  4. try{ return; }catch(){} finally{return;}
    Ps(无异常):程序执行try块中return之前(包括return语句中的表达式运算)代码;
    再执行finally块,因为finally块中有return所以提前退出。
  5. try{} catch(){return;}finally{return;}
    Ps(有异常):程序执行catch块中return之前(包括return语句中的表达式运算)代码;
    再执行finally块,因为finally块中有return所以提前退出。
  6. try{ return;}catch(){return;} finally{return;}
    Ps:程序执行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。


举报

相关推荐

0 条评论