2008/11/19

小心“==”埋下的地雷

在做国际化项目的时候,碰到一个问题,

比如:JButton b=new JButton(“Search”);

JButton b1=new JButton("Stop");

然后给这两个button注册监听器,

其中的actionperformed方法是这样的

public void actionPerformed(ActionEvent e)     {         if(e.getActionCommand()==“Search”)         {             disposeFrame();         }         else if(e.getActionCommand()=="Stop")         {             createTextView();         }     }

然后运行,没有问题。为什么没有问题呢,不是java对象不能==来判发布帖子断值是否相等的吗?

这是由于虚拟机有一个Java-String常量池来存放一些字符串常量 比如上面用到的Search和Stop都是被存储于该区域来提升程序性能,当执行e.getActionCommand()==“Search”或者e.getActionCommand()=="Stop"的时候,等好两边找到的字符串对象是常量池里面的同一个,所以没有问题,注意 这里==两边变量是同一个。

但是当我做国际化 替换到==右边的字符串时,问题就出来了,一般来说,右边被替换成的字符串极有可能不是同一个对象了 ,可能是用new String(“查询”)产生的,因此,这个判断的等式永远不可能成立。地雷爆炸了。

这个bug很难发现。

0 评论 :