专栏名称: Carson_Ho
走在产品路上的Android研究生
目录
相关文章推荐
开发者全社区  ·  上海相亲流行女生请客? ·  22 小时前  
开发者全社区  ·  和导师外出,他牵我手了... ·  昨天  
鸿洋  ·  HarmonyOS ... ·  2 天前  
开发者全社区  ·  除了性生活,就是打麻将? ·  2 天前  
开发者全社区  ·  辅导员投稿:和我的学生越界了 ·  2 天前  
51好读  ›  专栏  ›  Carson_Ho

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

Carson_Ho  · 掘金  · android  · 2018-12-03 04:23

正文

前言

  • 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 中的语句最好:







请到「今天看啥」查看全文