zoukankan      html  css  js  c++  java
  • try...cath...finally中的return什么时候执行


    finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。

    即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。
    如关闭数据库连接等等。
    注意:如果没有catch语句块,那么finally块就是必须的。


    1、不管try,finally都会执行;
    2、在try中return,在finally执行前会把结果保存起来,即使在finally中有修改也以try中保存的值为准,但如果是引用类型,修改的属性会以finally修改后的为准;
    3、如果try/finally都有return,直接返回finally中的return。



    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进行了改变,但是不会影响返回结果。
    它应该使用栈保存返回值。
     
  • 相关阅读:
    矩阵树定理
    随机乱搞算法
    数学
    BZOJ——3412: [Usaco2009 Dec]Music Notes乐谱
    BZOJ—— 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
    洛谷—— P2884 [USACO07MAR]每月的费用Monthly Expense
    洛谷—— P2417 课程
    洛谷—— P1577 切绳子
    COGS 2598. 美丽的感觉
    10.23 模拟赛
  • 原文地址:https://www.cnblogs.com/111testing/p/6741244.html
Copyright © 2011-2022 走看看