您的位置:首页 > 编程语言 > Java开发

Java:一文带你了解 不同情形下return 和 finally的执行顺序

2018-12-03 12:06 791 查看
版权声明:本文为博主原创文章,未经博主允许不得转载,更多请继续关注Carson_Ho https://blog.csdn.net/carson_ho/article/details/84756458

前言

  • Java
    中,不同情形下
    return
    finally
    的执行顺序很多人混淆不清
  • 本文全面 & 详细解析不同情形下
    return
    finally
    的执行顺序,希望你们会喜欢

目录

1. 储备知识

  • try / catch
    是常见的捕捉异常 & 处理的语句
  • 只有
    try
    语句中抛出异常,才会执行
    catch
    中的语句
/**
* try中无抛出异常,则catch中的代码不执行
*/
try{
// 代码无抛出异常
return  result;

}catch(Exception e){
// catch代码
}

/**
* try中抛出异常,则执行catch中的语句
*/
try{
//代码抛出异常
throw Exception;
return1  result1;

} catch(Exception e){
return2  result2; // 执行catch中的语句
}

2. 终极结论

无论什么情况(异常与否、

try / catch
前面存在
return
),
finally
块代码一定会执行

必须谨记!!

3. 具体场景分析

下面,我将根据具体的使用场景来全面解析不同情形下

return
finally
的执行顺序

3.1 try 或 catch中存在return语句、finally无return语句

  • 执行顺序 结论
    return
    后的语句->
    finally
    语句 ->
    return
    结束函数 & 返回值

finally
语句不影响最终返回值,即返回值在
finally
前就决定

  • 详细讲解
    此处细分为2种情况:
    a.
    try
    中有
    return
    、无抛出异常
    b.
    try
    中有
    return
    、抛出异常 、
    catch
    return
/**
* 情况1:try中有return、无抛出异常
* 实际执行顺序:
*            1. 执行 try块语句
*            2. 执行 return后 的语句:得到结果result & 保存下来
*            3. 执行 finally块语句:不影响上述保存的返回值,哪怕修改了变量的值
*            4. 执行 return,结束函数,返回result的值:依旧返回步骤2保存的结果
*/
try{
//代码无抛出异常
return  result;

}catch(Exception e){

}finally{
// finally代码
}

/**
* 情况2:try中有return、抛出异常 、catch有return
* 实际执行顺序:
*            1. 执行 try块语句
*		       2. 执行 throw 语句 :此时已抛出异常,运行因异常而终止,故不执行return1
*            3. 执行 catch块语句
*			   4. 执行 return2后 的语句:得到结果result2 & 保存下来
*			 5. 执行 finally块语句:不影响上述保存的返回值,哪怕修改了变量的值
*			 6. 执行 return2,结束函数,返回result2的值:依旧返回步骤4保存的结果
*/
try{
//代码抛出异常
throw Exception;
return1  result1;

}catch(Exception e){
return2  result2;

}finally{
// finally代码
}

3.2 finally中存在return语句(无论 try 或 catch之一 或 都存在return语句 )

  • 执行顺序 结论
    当执行到
    finally
    语句的
    return
    时,程序就直接返回

finally
中的
return
会覆盖掉其它位置的
return

  • 详细讲解
    此处细分为2种情况:
    a.
    try
    &
    catch
    中都无
    return
    、无抛出异常 &
    finally
    中 有
    return

    b.
    try
    /
    catch
    中任意1者 或 都有
    return
    try
    中的
    return
    catch
    中的
    return
    最多只有1个会执行)、
    finally
    中 有
    return
/**
* 情况1:try & catch中都无return、无抛出异常 & finally中 有 return
* 实际执行顺序:
*            1. 执行 try块语句
*            2. 执行 finally块语句:会影响返回值
*            3. 执行 return,结束函数,返回result的值
*/
try{

}catch(Exception e){

}finally{
return result ;
}

/**
* 情况2:try / catch中任意1者 或 都有return(try中的return和catch中的return最多只有1个会执行)、finally中 有 return
* 实际执行顺序:
*            1. 执行 try块语句:设无抛出异常,则不执行catch语句 & return2
*		       2. 执行 return1 后 的语句:得到结果result & 保存下来
*            3. 执行 finally块语句:不影响上述保存的返回值,哪怕修改了变量的值
*			   4. 执行finally内的 return3 后语句:finally中的return会覆盖掉其它位置的return
*			   5. 执行return3 ,结束函数,返回result3的值
*/
try{
//throw Exception;
return1 result1;

}catch(){
return2 result2;

}finally{
return3 result3;
}

特别注意

finally
中的语句最好:

  1. 不要包含
    return
    语句,否则程序会提前退出
  2. 返回值 ≠
    try
    catch
    中保存的返回值

至此,关于不同情形下

return
finally
的执行顺序 情况讲解完毕。

4. 总结

  • 本文主要讲解了不同情形下
    return
    finally
    的执行顺序,总结如下:

请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: