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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ♠Akechi♠ 中级黑马   /  2014-3-26 22:50  /  1243 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ♠Akechi♠ 于 2014-3-27 10:19 编辑

关于try ,catch, return的,我说如果try{return cmd.ExecuteNonQuery()//比如return了一个这个方法},如果finally里有cmd.Dispose()了,再执行return就会失败,因为已经Dispose了,这样回答错了么?

评分

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

查看全部评分

8 个回复

倒序浏览
我的理解是,try……catch……finally三部分是依次执行的,如果在try中return方法的返回值,当方法正常执行没有产生异常时,函数会因为return的作用直接跳出,不会执行到finally。
不知道我是不是正确理解了楼主的意思……
回复 使用道具 举报
无论try...catch..中执行哪个,最后都必须执行Finally..这是这个语法规定的。所以你在try中使用return程序就会报错~~而不是已经Dispose了。

评分

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

查看全部评分

回复 使用道具 举报
cancle 发表于 2014-3-27 00:48
无论try...catch..中执行哪个,最后都必须执行Finally..这是这个语法规定的。所以你在try中使用return程序 ...
  1.         static void Main(string[] args)
  2.         {
  3.             test();
  4.             Console.ReadKey(true);
  5.         }

  6.         static void test()
  7.         {
  8.             try
  9.             {
  10.                 Console.WriteLine("test");
  11.                 return;
  12.             }
  13.             catch
  14.             {
  15.             }
  16.             finally
  17.             {
  18.             }
  19.         }
复制代码

但是我试了一下,这段代码可以正常编译运行啊。

评分

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

查看全部评分

回复 使用道具 举报
鬼鬼 发表于 2014-3-27 01:14
但是我试了一下,这段代码可以正常编译运行啊。

这是因为你的Finally中什么也没写,而他写了一个释放资源的方法。return后就跳出方法了,而不会执行Finally所以才会报错。
回复 使用道具 举报
额,我发现我错了。。楼主的想法是对的。finally其实是仅在return ; 语句执行前执行,如果return 一个函数,那么会先执行函数,但如果函数内有(return ;)语句,那么finally就会在这个(return ;)语句前执行。
回复 使用道具 举报
鬼鬼 中级黑马 2014-3-27 02:02:24
7#
用字符流模拟了一下,不知道符不符合楼主的想法:
  1.         static void Main(string[] args)
  2.         {
  3.             Console.Write(readText());
  4.             Console.ReadKey(true);
  5.         }

  6.         static string readText()
  7.         {
  8.             StreamReader sr = new StreamReader("..\\..\\TextFile.txt", Encoding.Default);
  9.             try
  10.             {
  11.                 return sr.ReadToEnd();
  12.             }
  13.             catch
  14.             {
  15.                 sr.Dispose();
  16.             }
  17.             finally
  18.             {
  19.                 sr.Dispose();
  20.             }
  21.             return "";
  22.         }
复制代码

运行结果是正常输出文本文档中的字符。
回复 使用道具 举报
看了你们的讨论,我又试了下,确实是finally先Dispose关闭了,谢谢大家的思路
回复 使用道具 举报
语法是不能在finally语句块中写break、continue、或goto语句。吧控制转移到finally语句外
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马