黑马程序员技术交流社区

标题: finally能否执行? [打印本页]

作者: lijun6459991    时间: 2011-12-15 20:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: 刘基军    时间: 2011-12-15 21:01
return语句,可以执行finally{}语句块;
若是System.exit(0),不会执行到finally{}。
作者: 张旭    时间: 2011-12-15 21:51
不管try成功还是不成功   finally都要执行
作者: 周胜    时间: 2011-12-15 21:59
不管成功与否,finally还是要执行;
除非在try{}catch中写入System.exit(0)或System.exit(1)
作者: 刘波    时间: 2011-12-19 16:09
try里面是执行代码,其中的代码"可能"产生异常.
catch是对产生异常后的处理代码,可以抛出异常,也可以显示异常,也可以弹出某中提示,总之catch里是任何代码都行,如果你知道这钟异常产生的原因,可以打印此原因,也可以对此原因进行相应的处理,同时可以为多个catch,每个catch(异常类型)  用多个catch来捕获多种异常,也可以用所有异常的父类来捕获(这样就不用写多个catchl了).  
假如try中产生了异常,那么try从产生异常开始到try结束的这段代码将不会执行,转而去执行catch.
finally是try执行完后执行(没发生异常)或者在catch后执行(发生了异常),也就是说finally无论怎么样,都会执行.除非在try{}catch中写入System.exit(0)
3个连起来就像平时口语中的  "(try)假如^^^^^^,(catch)就^^^^^^^^^,(finally)最后^^^^^^^^^^
作者: 张大福    时间: 2011-12-20 12:28
我们都知道有两大规则:
第一个规则:执行代码时遇return就跳出个函数。
第二个规则:无论try中代码是否异常,finally中代码还是要执行。

现在的问题是try中代码没有异常,但有return;根据第一个规则,finally中代码绝对不会执行的,这个符合常理。但事实真是这样吗?看那就看代码吧。

下面是一段检测代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace xxfinally测试
{
    class Program
    {
        static void Main(string[] args)
        {

            //int m = 5, n = 0;

            try
            {

                //int div = m / n;

                Console.WriteLine("我是try中代码,在return前面");
                return;
                Console.WriteLine("我是try中代码,我在return后面");
            }
            catch(Exception e)
            {
                Console.WriteLine("产生异常,在return前面");
                return;
                Console.WriteLine("产生异常,在return后面");
            }
            finally
            {
                Console.WriteLine("try中有return,catch中有return,但我是finally中的代码,return语句即使要执行,我还是会执行的,我永远在return前执行。哈哈。");
                Console.ReadKey();
            }
            Console.WriteLine("我在异常代码后");
            Console.ReadKey();
        }
    }
}

执行结果如下:


将上面的测试代码的注释去掉,执行结果如下:


由此可见,这已经不符合第一个规则了,但符合第二个规则。我们可以得出一个结论:在try中和catch中,遇到return,就直接执行finally中语句,然后才跳出函数。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2