闲聊null==a

Categories:

故事

代码评审的时候,是不是还会看到有小伙伴写下null == a这样的代码。
有时心血来潮,我会问一句,为什么这样写?
如果他回答里有防止空指针的话,我可能会对他有点失望。

剖析

为什么会出现这样的写法?防止空指针又是什么骚操作?
我们来看看下面的两个例子。

String a = null;

a.equals("something");   // ---> null.equals("something")
"something".equals(a);   // ---> "something".equals(null);     

显然null是没有equals方法的,所以会出现NullPointerException。
这种场景下把变量放在equals右侧确实可以避免NullPointerException或减少一次null判断。

再来看两个例子。

String a = null;

a == null;    // ---> null == null
null == a;    // ---> null == null

我们会发现,对于Java来说变量写在==左边或右边都没有区别。

所以对于Java程序员来说,一刀切地把变量写在比较符右边就是一种典型的想当然。

我猜也许发展过程是这样:
一开始的时候,写a.equals("something");出现过NullPointerException。
这时有前辈指导他写成"something".equals(a);
然后他自己死记硬背记住了,把变量写在比较符右边。
最后把比较符从equals扩展到==

彩蛋

眼尖的小伙伴可能发现了,上面特意高亮了对于Java来说等字眼, 其他语言难道有不一样吗?

还真是!比如javascript

if(a == null){
    console.log(1)
}else{
    console.log(2)
}

如果==漏写了个=,代码就变成了

if(a = null){
    console.log(1)
}else{
    console.log(2)
}

这段代码在编译时不会报错,在执行时相当于把 == 相等判断变成了 = 变量赋值语句。

如果你觉得本文对你有帮助或不错,可略表心意,请我喝一杯冰可乐。

Comments