try-catch-finally执行顺序详解

  • 2017年6月2日
  • Java

情况1:try{} catch(){}finally{} return; 
按正常顺序执行。


情况2:try{ return; }catch(){} finally{} return; 
程序执行try块中return之前(包括return语句中的表达式运算)代码; 
再执行finally块,最后执行try中return; 
finally块后面的return语句不再执行。


情况3:try{ } catch(){return;} finally{} return; 
程序先执行try,如果遇到异常执行catch块, 
有异常: 
    则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码, 
    最后执行catch块中return. finally块后面的return语句不再执行。 
无异常: 
执行完try再finally再执行最后的return语句.


情况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所以提前退出。

package com.longlonggo.review02;

/**
 * try-catch-finally运行顺序测试
 * @author longlonggo.com
 * @version 
 * 版本号:【100-000-000】<br/>
 * 创建日期::2017年2月6日 <br/>
 * 历史修订:<br/>
 */
public class Review02 {

	public static void main(String[] args) {
		System.out.println("-------" + myTest());
	}

	/**
	 * try-catch-finally测试方法
	 * 
	 * @return 测试结果
	 */
	public static String myTest() {
		// //正常流程返回3
		// try {
		// } catch (Exception e) {
		// } finally{
		// }
		// return "3";

		// //正常执行try返回2
		// try {
		// return "2";
		// } catch (Exception e) {
		// } finally{
		// }
		// return "3";

		// //try出现异常时,catch中返回2
		// try {
		// int c = 1 / 0;
		// return c + "";
		// } catch (Exception e) {
		// return "2";
		// } finally{
		// }
		// return "3";

		// try中有异常时执行catch中所有代码,包括catch中return函数的语句(不返回),
		// 然后执行finally,此时finally中有返回,所以跳出finally中的return,又因为catch中改变了num值
		// 所以会有输出结果:num:11, -------12
		int num = 11;
		try {
			num = 1 / 0;
		} catch (Exception e) {
			System.out.println("num:" + num);
			return num++ + "";
		} finally {
			return num + "";
		}
	}
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注