Facebook Sharer
选择您要替换的背景颜色:
【农历新年】背景图片:
个性化设定
 注册  找回密码
查看: 1881|回复: 7
打印 上一主题 下一主题

java exception 在finally赋值为什么无效 ?

[复制链接]

8

主题

0

好友

75

积分

中级会员

Rank: 2Rank: 2

跳转到指定楼层
1#
发表于 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

请解释。哈哈




收藏收藏0

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

2#
发表于 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??


回复

使用道具 举报

8

主题

0

好友

75

积分

中级会员

Rank: 2Rank: 2

3#
发表于 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
就会看到这类的程式了


回复

使用道具 举报

8

主题

0

好友

75

积分

中级会员

Rank: 2Rank: 2

4#
发表于 2009-12-24 02:21 PM |只看该作者
dot net 朋友 较少接触这类的程式。

因为他们大多数是 不需要处理多线程的 程式的 (因为风格,设计观念注重的领域不同。) 。


回复

使用道具 举报

20

主题

4

好友

2395

积分

白金长老

Rank: 10

5#
发表于 2009-12-26 02:49 AM |只看该作者
finally 原本的用途就是为了 clean resources,所以 Java 设计师就设计成 variable 即使在 finally 被赋值后,但是在外面最后 return 的值还是等于未进去 finally block 的值。即使是 object 里面存放的 value 发生了变动也是一样,他会记得之前的。好像 Transaction Rollback 的样子。


回复

使用道具 举报

8

主题

0

好友

75

积分

中级会员

Rank: 2Rank: 2

6#
发表于 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();
   }
}


回复

使用道具 举报

20

主题

4

好友

2395

积分

白金长老

Rank: 10

7#
发表于 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。


回复

使用道具 举报

8

主题

0

好友

75

积分

中级会员

Rank: 2Rank: 2

8#
发表于 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 |联系我们 |隐私政策 |Share

GMT+8, 2024-7-1 03:22 PM , Processed in 0.121293 second(s), 27 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

Ultra High-performance Dedicated Server powered by iCore Technology Sdn. Bhd.
Domain Registration | Web Hosting | Email Hosting | Forum Hosting | ECShop Hosting | Dedicated Server | Colocation Services
本论坛言论纯属发表者个人意见,与本论坛立场无关
Copyright © 2003-2012 JBTALKS.CC All Rights Reserved
合作联盟网站:
JBTALKS 马来西亚中文论坛 | JBTALKS我的空间 | ICORE TECHNOLOGY SDN. BHD.
回顶部