有return的情况下try catch finally的执行顺序(最有说服力的总结)


结论:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
举例:
情况1:try{} catch(){}finally{} return;
            显然程序按顺序执行。
情况2:try{ return; }catch(){} finally{} return;
          程序执行try块中return之前(包括return语句中的表达式运算)代码;
         再执行finally块,最后执行try中return;
         finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:try{ } catch(){return;} finally{} return;
         程序先执行try,如果遇到异常执行catch块,
         有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
                     最后执行catch块中return. finally之后也就是4处的代码不再执行。
         无异常:执行完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所以提前退出。

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
                  如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
                  编译器把finally中的return实现为一个warning。

 

下面是个测试程序
public class FinallyTest  
{
	public static void main(String[] args) {
		 
		System.out.println(new FinallyTest().test());;
	}

	static int test()
	{
		int x = 1;
		try
		{
			x++;
			return x;
		}
		finally
		{
			++x;
		}
	}
}
结果是2。
分析:
	在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果,
因此,即使finally中对变量x进行了改变,但是不会影响返回结果。
它应该使用栈保存返回值。

  • 178
    点赞
  • 628
    收藏
    觉得还不错? 一键收藏
  • 52
    评论
### 回答1: try catch finally执行顺序是先执行 try 块中的代码,如果出现异常则跳转到对应的 catch 块,执行 catch 块中的代码,最后无论是否出现异常,都会执行 finally 块中的代码。 ### 回答2: try catch finally 执行顺序是先执行 try 语句块中的代码,如果没有发生异常则跳过 catch 语句块,直接执行 finally 语句块中的代码。如果在 try 语句块中发生了异常,程序会跳出 try 块,然后寻找匹配的 catch 块来处理异常。如果找到了匹配的 catch 块,则执行这个块中的代码,并跳过 finally 块。如果没有找到匹配的 catch 块,则异常会传递到上层调用者,直到找到了匹配的 catch 块或程序结束。 无论是否发生异常,finally 语句块中的代码都会被执行,即使在 trycatch 块中有 return 语句。当异常被抛出时,会先执行 finally 块的代码,然后再将异常传递给上层调用者。 总结起来,try 语句块中的代码首先被执行,如果没有发生异常,则执行 finally 语句块中的代码;如果发生异常,则先执行 finally 语句块中的代码,然后执行匹配的 catch 语句块中的代码,最后再执行 finally 语句块中的代码。无论是否发生异常,finally 语句块中的代码都会被执行。 这种执行顺序的设计可以确保在程序执行过程中资源的释放和清理操作,即使发生了异常也能够得到处理。 ### 回答3: try catch finally 是一种错误处理机制。在程序执行过程中,当发生错误时,try语句块中的代码会被执行,如果没有错误发生,catchfinally语句块就不会执行try语句块中的代码被执行时,如果出现异常,程序会立即转到与之对应的catch语句块。catch语句块负责处理异常,并提供对应的异常处理逻辑。在catch语句块中,可以根据捕获到的异常类型进行相应的处理,例如输出错误信息、记录日志、回滚事务等。 无论是否发生异常,finally语句块中的代码都会被执行。这意味着,无论try块中的代码是否成功执行finally语句块里的代码都会被执行到。finally语句块通常用于释放资源、回收内存等操作,在代码中确保必须执行的一段逻辑。 try catch finally执行顺序如下: 1. 程序首先执行try语句块中的代码。 2. 如果try语句块中的代码没有发生异常,catch语句块将被跳过。 3. 如果try语句块中的代码发生异常,运行时系统会查找与之对应的catch语句块,并执行相应的异常处理逻辑。 4. catch语句块执行完毕后,程序会继续执行finally语句块中的代码。 5. finally语句块中的代码执行完毕后,程序继续执行try catch finally块之后的代码。 总的来说,try catch finally块的执行顺序是:先执行try语句块,再执行catch语句块(如果有异常发生),最后执行finally语句块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值