第二银行

yp.wang

导航

equals

Posted on 2010-12-10 22:14  第二银行  阅读(634)  评论(2)    收藏  举报

有人和我说:

                boolean a = (this.projectAssociation.getAfn() != null && !this.projectAssociation.getAfn().equals(""));

这种写法不严密,当this.projectAssociation.getAfn()为null时会抛出 NullPointerException 异常,应该写成 :

"".equals(this.projectAssociation.getAfn())

这样就能防止NullPointerException异常的发生

 

当时,我想了想,写了个测试方法

class testNull{
public static void main(String args[]){
  String s = null;

  System.out.println(!s.equals(“”));

}
}

 确实会抛出异常如下:

Exception in thread "main" java.lang.NullPointerException
        at testNull.main(testNull.java:4)

 

写成如下方式却不会抛出异常:

class testNull{
public static void main(String args[]){
  String s = null;

  System.out.println(!"".equals(s));

}
}

 打印的结果为 true

 当时我意识到自己确实是疏忽了 。。。 。。。

可是,现在看看API,却觉得还有很多需要思考的,不能只是顺从别人的想法,请看API如下:

equals

public boolean equals(Object anObject)
将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true
覆盖:
Object 中的 equals
参数:
anObject - 与此 String 进行比较的对象。
返回:
如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false
另请参见:
compareTo(String), equalsIgnoreCase(String)

API的意思是equals里面的参数 当且仅当该参数不为 null 且 是与此对象表示相同字符序列的 String 对象时,结果才为 true,换个角度考虑,

如果参数为null,

要么抛出异常,要么就是返回false,不可能有第三种情况!

现在返回到开头提到的问题,如果仅仅因为怕抛出异常而把 前面的对象作为参数,这样做在逻辑上不严密的,因为一旦获取的对象是空,就相当于

“”。equals(null),返回的肯定是 false,但是在现实的一些应用中,对于String类型我们一般是把null和“”都认为是空,希望得到的true,

而不是fals,因此,为了防止抛出异常,而把有可能为null的对象放到参数的位置,是不可取的。

进过上面的分析,我倒是产生了一种相反的想法:我们不应该把有可能为null的对象放到equals的参数位置,因为一旦放进去,我们有可能连异常都得不到,得到的是可怕的 错误的结果。

我们在java编程过程中,不应该害怕有异常抛出,相反,我们应该尽量使我们的程序抛出更多的异常,应该引导异常的抛出,去判断修补每一个抛出异常的地方,这样才能使程序更加严密。

写到这里,返回开头,我倒是认为我开始的写法没有什么不严密的地方了,因为我先判断了 是否为null的情况,因为以前理解不深刻,才被那个哥们给上了一课,当时觉得很是佩服,但是现在看来,他也有可能是考虑的少了一点,今天写多了,总之,大家共同学习,共同进步吧!

关于以上,如有不周全的地方,欢迎批评指教!