A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐阳 中级黑马   /  2012-9-22 11:24  /  1758 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在异常处理中我通常就用到了try{};和catch{};
这两个还比较清楚,一个是尝试,另一个是捕获了异常要做的事情。
可是 finally{};的功能是做什么呢

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

6 个回复

倒序浏览
老师在多线程聊天室视频中有涉及到这个。
可以这样认为 finally{}不管什么情况都会被执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally(而且是在执行try或catch之后执行的,finally这个单词就是最终的意思)

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 晋志强 于 2012-9-22 12:58 编辑

这样理解: "(try)假如xx,(catch)就xxx,(finally)最后xxxx
简单例子:
using System;
public class chushu
{
private static void Main()
{
    int number1=100;
    int number2= 0;
    int number3= 10;
    try
    {
        Console.WriteLine("100/10=",number1/number3);//(2)
        Console.WriteLine("我这里不会发生异常,我可以正常显示");
         Console.WriteLine("我这里会发生异常,我可以不能正常显示");//(1)
         Console.WriteLine("10/0=",number3/number2);
    }
    catch(Exception e)
    {
      Console.WriteLine("传递过来的异常值为{0}",e);
    }
    finally
    {
      Console.WriteLine("无论是否发生异常,我都会显示。");
    }
}
}

注:(1)行被执行则会抛出一个异常,如果没有catch语句,程序会异常终止,使用不带参数的catch子句,则可以捕获任意类型的异常。
如果将(1)行和上面的相关变量声明注释掉,启用(2)行,这意味该程序运行时不会出现异常,从输出可知,finally代码块仍将被执行。
我们再更改一下上面的例子:
如果去掉上面的try...catch语句,直接编写程序,结果会怎样呢?
using System;
public class DivisorIsZero
{
private static void Main()
{
        int number1=100;
        int number2= 0;
        int number3= 10;
        Console.WriteLine("100/10=",number1/number3);//(2)
        Console.WriteLine("我这里不会发生异常,我可以正常显示");
         Console.WriteLine("我这里会发生异常,我可以不能正常显示");//(1)
         Console.WriteLine("10/0=",number3/number2);
}
}

执行后发现,提示未处理异常,试图除以零的错误信息。
对比前后的结果可以发现,前面的代码由于进行了异常处理,程序不会中断执行,而是将异常作为程序的一部分来执行。后面的代码没有进行异常处理,导致代码执行期间遇到异常时,终止程序执行,提示错误信息

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
简单点讲就是
try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
try{
      你在家吃饭
}
catch{
      没吃饱,饭没了
}
finally{
     洗碗
}


你在家吃饭,不管吃饱了,还是没吃饱饭没了,你都要洗碗{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
李阳_TickTock 发表于 2012-9-22 14:41
try{
      你在家吃饭
}

形象!!
回复 使用道具 举报
在try到的异常之后用来清理资源的,比如io的操作前面创建了文件,但是在读写的时候抛出了异常就可以在finally里面删除掉,finally的代码总会执行除了System.exit(),即使在try中有return语句finally也会在return之前执行,比原来理解的更透彻一点了吧O(∩_∩)O哈哈~

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马