有人和我说:
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。 - 参数:
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的情况,因为以前理解不深刻,才被那个哥们给上了一课,当时觉得很是佩服,但是现在看来,他也有可能是考虑的少了一点,今天写多了,总之,大家共同学习,共同进步吧!
关于以上,如有不周全的地方,欢迎批评指教!
浙公网安备 33010602011771号