黑马程序员技术交流社区

标题: try...finally的问题 [打印本页]

作者: HM朱百青    时间: 2013-4-9 00:06
标题: try...finally的问题
本帖最后由 HM朱百青 于 2013-4-9 22:46 编辑

int =1
public int Count()
{
   try
  {
    return  i;
  }
  finally
  {
     i+=1;
  }
}
这个的返回值是多少?  为什么??


作者: 许庭洲    时间: 2013-4-9 06:14
1. 返回值是2;
2。计数器函数内先执行finally{}语句内的语句,然后再执行try{}里面的语句,最后返回值是2。
作者: 张正强    时间: 2013-4-9 08:14
返回值为1;执行顺序:①执行try{}里的code,将结果保存在内存中未返回;②执行 finally {}里的 code;③返回try{}里的执行结果。
楼主可以亲测~~~
作者: 郑丹丹1990    时间: 2013-4-9 08:16
我觉得是1,然后试验了下确实是1.
i=2,但是你return时此时此刻i=1。
定义时,楼主笔误:int i=1;
作者: 陈志盟    时间: 2013-4-9 10:31
  1.         static void Main(string[] args)
  2.         {
  3.             
  4.             Count();
  5.             Console.WriteLine(i);
  6.             Console.ReadKey();
  7.         }
  8.         static int i = 1;
  9.         public static int Count()
  10.         {

  11.             try
  12.             {
  13.                 return i;
  14.             }
  15.             finally
  16.             {
  17.                 i += 1;
  18.             }
  19.         }
复制代码
返回值为2
原因就是在一个try-finally语句中,finally语句总是在控制权离开try语句块时执行的。无论try语句是正常结束的,还是意外结束的。一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个break或continue,或是象这个程序一样在方法中执行了一个return时,将发生意外结束。它们之所以被称为意外结束,是因为它们阻止程序去按顺序执行下面的语句
作者: HM朱百青    时间: 2013-4-9 10:45
张正强 发表于 2013-4-9 08:14
返回值为1;执行顺序:①执行try{}里的code,将结果保存在内存中未返回;②执行 finally {}里的 code;③返 ...

对的!谢谢
作者: HM刘磊    时间: 2013-4-9 15:54
这个得对try  --catch --finally语法说明一下在其中try关键字是负责检查下面Code是否异常如果异常就转到catch执行下面code,
但不管是否异常finally里的代码在try catch  finally控制权移交之前都会得到执行,所以函数的返回值为2.
作者: 张振    时间: 2013-4-9 21:14
本帖最后由 张振 于 2013-4-9 21:15 编辑

你这代码有问题  你的意思是要证明到底返回哪一个值 是finally 还是try  你的try里面写了return
而finally 里面没有return 所以你给的代码压根就不能证明你的问题   所以你的代码就算拿去验证 返回值也是为1
但你的finally中如果加了return又不能执行 因为finally是必须执行的 不管try能不能执行 但在finally中加入return去跳出的话就会报错 你可以试试 所以你的问题是有 但目前你给的代码却不能表达你想要的意思
作者: HM朱百青    时间: 2013-4-9 22:22
许庭洲 发表于 2013-4-9 06:14
1. 返回值是2;
2。计数器函数内先执行finally{}语句内的语句,然后再执行try{}里面的语句,最后返回值是2 ...

不对的哦  还是先执行try  在执行finally语句    其实这个函数的返回值还是1,这只不过是编译器帮我们玩了一个技巧而已
  1. public int Count()
  2. {
  3.     int CS$1$0000;
  4.     try
  5.     {
  6.         CS$1$0000 = this.i;
  7.     }
  8.     finally
  9.     {      
  10.         this.i++;
  11.     }
  12.     return CS$1$0000;
  13. }

复制代码
这是反编译后的程序   我理解了 谢谢你的回答  也希望你理解!
作者: HM朱百青    时间: 2013-4-9 22:22
许庭洲 发表于 2013-4-9 06:14
1. 返回值是2;
2。计数器函数内先执行finally{}语句内的语句,然后再执行try{}里面的语句,最后返回值是2 ...

不对的哦  还是先执行try  在执行finally语句    其实这个函数的返回值还是1,这只不过是编译器帮我们玩了一个技巧而已
  1. public int Count()
  2. {
  3.     int CS$1$0000;
  4.     try
  5.     {
  6.         CS$1$0000 = this.i;
  7.     }
  8.     finally
  9.     {      
  10.         this.i++;
  11.     }
  12.     return CS$1$0000;
  13. }

复制代码
这是反编译后的程序   我理解了 谢谢你的回答  也希望你理解!
作者: HM朱百青    时间: 2013-4-9 22:34
张振 发表于 2013-4-9 21:14
你这代码有问题  你的意思是要证明到底返回哪一个值 是finally 还是try  你的try里面写了return
而finally  ...

这个我写的有不详细的地方  不过这道题很明显证明的就是这个函数的返回值到底是多少!  由于代码是我在论坛手写,在定义变量的时候不小心拉掉了 i  !当然我们不能把return  放在finally里面 ,因为这样假设try中出现了问题,试问一个除了异常的函数怎么会有正常的返回值呢!我是这样认为的!至于这个问题已经解决了 谢谢你的回答
作者: HM朱百青    时间: 2013-4-9 22:36
郑丹丹1990 发表于 2013-4-9 08:16
我觉得是1,然后试验了下确实是1.
i=2,但是你return时此时此刻i=1。
定义时,楼主笔误:int i=1; ...

我手写的  是失误了点 呵呵  这个代码的反编译给你看看
public int Count()
{
    int CS$1$0000;
    try
    {
        CS$1$0000 = this.i;
    }
    finally
    {      
        this.i++;
    }
    return CS$1$0000;
}
作者: 郑丹丹1990    时间: 2013-4-10 07:55
HM朱百青 发表于 2013-4-9 22:36
我手写的  是失误了点 呵呵  这个代码的反编译给你看看
public int Count()
{

试验了下确实是1????这是为何????????楼主!!!!!!!!!!!!!!!!
作者: HM朱百青    时间: 2013-4-10 10:00
郑丹丹1990 发表于 2013-4-10 07:55
试验了下确实是1????这是为何????????楼主!!!!!!!!!!!!!!!! ...

因为编译器在编译的时候,他会给我们生成一个字段int CS$1$0000;   而最后return的也是return CS$1$0000;所以结果当然还是1了!   
作者: 郑丹丹1990    时间: 2013-4-10 10:03
HM朱百青 发表于 2013-4-10 10:00
因为编译器在编译的时候,他会给我们生成一个字段int CS$1$0000;   而最后return的也是return CS$1$0000; ...

有关反编译??俺半点也不知道?
作者: HM朱百青    时间: 2013-4-10 10:50
郑丹丹1990 发表于 2013-4-10 10:03
有关反编译??俺半点也不知道?

reflector    度娘一下吧




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