当前位置 : 主页 > 编程语言 > java >

【Java -- 基础】了解 return 和 finally 的执行顺序

来源:互联网 收集:自由互联 发布时间:2022-06-22
前言 在 Java 中,不同情形下 return 和 finally 的执行顺序很多人混淆不清。本文全面 详细解析不同情形下return 和 finally的执行顺序。 1. 储备知识 try / catch 是常见的捕捉异常 处理的语句

前言

在 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中的语句
}

无论什么情况(异常与否、try / catch 前面存在return),finally块代码一定会执行

2. 场景分析

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

  • 执行顺序
    return 后的语句-> finally 语句 -> 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代码
}

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

  • 执行顺序
    当执行到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 中的语句最好:

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


上一篇:【Java -- 基础】Object 类的公有方法
下一篇:没有了
网友评论