黑马程序员技术交流社区

标题: 今天被问到的一个问题 [打印本页]

作者: ♠Akechi♠    时间: 2014-3-26 22:50
标题: 今天被问到的一个问题
本帖最后由 ♠Akechi♠ 于 2014-3-27 10:19 编辑

关于try ,catch, return的,我说如果try{return cmd.ExecuteNonQuery()//比如return了一个这个方法},如果finally里有cmd.Dispose()了,再执行return就会失败,因为已经Dispose了,这样回答错了么?
作者: 鬼鬼    时间: 2014-3-27 00:02
我的理解是,try……catch……finally三部分是依次执行的,如果在try中return方法的返回值,当方法正常执行没有产生异常时,函数会因为return的作用直接跳出,不会执行到finally。
不知道我是不是正确理解了楼主的意思……
作者: cancle    时间: 2014-3-27 00:48
无论try...catch..中执行哪个,最后都必须执行Finally..这是这个语法规定的。所以你在try中使用return程序就会报错~~而不是已经Dispose了。
作者: 鬼鬼    时间: 2014-3-27 01:14
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.         }
复制代码

但是我试了一下,这段代码可以正常编译运行啊。
作者: cancle    时间: 2014-3-27 01:24
鬼鬼 发表于 2014-3-27 01:14
但是我试了一下,这段代码可以正常编译运行啊。

这是因为你的Finally中什么也没写,而他写了一个释放资源的方法。return后就跳出方法了,而不会执行Finally所以才会报错。
作者: cancle    时间: 2014-3-27 01:37
额,我发现我错了。。楼主的想法是对的。finally其实是仅在return ; 语句执行前执行,如果return 一个函数,那么会先执行函数,但如果函数内有(return ;)语句,那么finally就会在这个(return ;)语句前执行。
作者: 鬼鬼    时间: 2014-3-27 02:02
用字符流模拟了一下,不知道符不符合楼主的想法:
  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.         }
复制代码

运行结果是正常输出文本文档中的字符。
作者: ♠Akechi♠    时间: 2014-3-27 10:19
看了你们的讨论,我又试了下,确实是finally先Dispose关闭了,谢谢大家的思路
作者: Doublekill    时间: 2014-3-28 20:59
语法是不能在finally语句块中写break、continue、或goto语句。吧控制转移到finally语句外




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