组内code review时,有同学提到字符串判断空值的写法,如下两种,

(1)null在后,

@Test
public void testDemo1() {
  String str = null;
  if (str == null) {
    System.out.println("null在后");
    return;
  }
}

(2)null在前,

@Test
public void testDemo2() {
  String str = null;
  if (null == str) {
    System.out.println("null在前");
    return;
  }
}

这两种写法,有什么区别?

这两个测试,都可以执行,有种解释是,null放在前面是为了避免少写一个"=",因为"null="书写会报错,防止笔误写成"=null",不会报错,进而漏掉问题。

null==a是以前C语言的写法,因为C允许if(a=null)这种判断,但这个其实是少写了个"=",所以c开发的人员为了避免这问题,就出现了null==a的写法,因为这样一旦漏写了个=号,编译器就会编译不通过。

但这在Java和c#这种面向对象的语言里面是不需要的,因为少个=号,不管java还是C#都是编译错误。

因此,Java中对null进行判断放在前后没有什么区别,只是为了代码规范,为了避免写代码时书写错误(建议将null放在前面,并不强制)。

顺带说下,Java中判断字符串是否为空的四种方法,

方法一:最多人使用的一个方法,直观,方便,但效率很低,

if(s == null || s.equals(""));

方法二:比较字符串长度,效率高

if(s == null || s.length() == 0);

方法三:Java SE 6.0才开始提供的方法,效率和方法二几乎相等,但出于兼容性考虑,推荐使用方法二,

if(s == null || s.isEmpty());

方法四:这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多,

if (s == null || s == "");

注意,s == null这个判断是有必要存在的,如果String类型为null,进行equals(String)或length()等操作会抛出java.lang.NullPointerException。而且s==null的顺序必须出现在前面,不然同样会抛出java.lang.NullPointerException。