JBTALKS.CC

标题: java exception 在finally赋值为什么无效 ? [打印本页]

作者: qweasdzxc    时间: 2009-12-24 11:03 AM
标题: java exception 在finally赋值为什么无效 ?
public class Test
{
   private static int todo()
   {
      int b = 1;
      try
      {
         int a = 2 / 0;
      }
      catch (Exception e)
      {
         System.out.println("in catch");
         return b;
      }
      finally
      {
         b = 3;
         System.out.println("in final");
      }
      return 2;
   }

   /**
    * @param args
    */
   public static void main(String[] args)
   {
      System.out.println(todo());

   }
}

如题。final 的结果如下。
in catch
in final
1

为何不是
in catch
in final
3

请解释。哈哈
作者: Super-Tomato    时间: 2009-12-24 12:19 PM
原帖由 qweasdzxc 于 2009-12-24 11:03 AM 发表
public class Test
{
   private static int todo()
   {
      int b = 1;
      try
      {
         int a = 2 / 0;
      }
      catch (Exception e)
      {
         System.out.println("in catch");
         return b;
      }
      finally
      {
         b = 3;
         System.out.println("in final");
      }
      return 2;
   }

   /**
    * @param args
    */
   public static void main(String[] args)
   {
      System.out.println(todo());

   }
}

如题。final 的结果如下。
in catch
in final
1

为何不是
in catch
in final
3

请解释。哈哈




      catch (Exception e)
      {
         System.out.println("in catch");
         return b;
      }


這裡 return 了, 為何還執行 final??
作者: qweasdzxc    时间: 2009-12-24 02:17 PM
some time ,finally  block need close some resource.
eg) return pool  resource................ Lock resource


你可以参考别人 控制 multi thread Lock resource 的code
就会看到这类的程式了
作者: qweasdzxc    时间: 2009-12-24 02:21 PM
dot net 朋友 较少接触这类的程式。

因为他们大多数是 不需要处理多线程的 程式的 (因为风格,设计观念注重的领域不同。) 。
作者: fyhao    时间: 2009-12-26 02:49 AM
finally 原本的用途就是为了 clean resources,所以 Java 设计师就设计成 variable 即使在 finally 被赋值后,但是在外面最后 return 的值还是等于未进去 finally block 的值。即使是 object 里面存放的 value 发生了变动也是一样,他会记得之前的。好像 Transaction Rollback 的样子。
作者: qweasdzxc    时间: 2009-12-26 12:27 PM
不对

那地下的程式你又如何说明。

public class Test
{

   

   private static TestObject todo1()
   {
      TestObject tmpObj = new TestObject();
      tmpObj.setParameter("1");
      try
      {
         int a = 2 / 0;
      }
      catch (Exception e)
      {
         System.out.println("in catch");
         tmpObj.setParameter("2");
         return tmpObj;
      }
      finally
      {
         tmpObj.setParameter("3");
         System.out.println("in final");
      }
      return tmpObj;

   }

   /**
    * @param args
    */
   public static void main(String[] args)
   {
      System.out.println(todo1());
   }

}

class TestObject
{
   private String tmpParameter = null;

   public String getParameter()
   {
      return tmpParameter;
   }

   public void setParameter(String tmp)
   {
      tmpParameter = tmp;
   }

   public String toString()
   {
      return this.getParameter();
   }
}
作者: fyhao    时间: 2009-12-26 01:34 PM
一个完整的解释:
在第一个,在 catch block return 了一个 integer,这个时候 JVM 就会把 b = 1 copy 进去 return 的 stack 里面,这个时候不管 integer 在 finally 变成了 3,放在 return 的 值还是不会变,除非你在 finally 另外放一个 return,它才会再 copy b = 3 进去 stack 上面。

在第二个,可见在 catch block return 了那个 object 自己,这个时候 JVM 是把那个 object 的 reference copy 进去 return 的 stack,这时,不管在 finally 里面怎样变动那个 object 里面的 value 都好,最后还是 return 回那个 Object。

当然,如果在 catch block 那边,你return的是 tmpObj.toString() 或 tmpObj.getParameter() ,object 的 某个 properties 被 copy 进去 return 的 stack,在 finally 更换那个 Properties,这个时候就会发现 return 回原本那个 Properties。
作者: qweasdzxc    时间: 2009-12-26 03:31 PM
the key is " return "  and depend u return is value or reference.
and String Object is value Object not reference object.

not bad ur java basic.




欢迎光临 JBTALKS.CC (https://jbtalks.my/) Powered by Discuz! X2.5