组内code review时,有同学提到字符串判断空值的写法,如下两种,
(1)null在后,
代码语言:javascript复制@Test
public void testDemo1() {
String str = null;
if (str == null) {
System.out.println("null在后");
return;
}
}
(2)null在前,
代码语言:javascript复制@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中判断字符串是否为空的四种方法,
方法一:最多人使用的一个方法,直观,方便,但效率很低,
代码语言:javascript复制if(s == null || s.equals(""));
方法二:比较字符串长度,效率高
代码语言:javascript复制if(s == null || s.length() == 0);
方法三:Java SE 6.0才开始提供的方法,效率和方法二几乎相等,但出于兼容性考虑,推荐使用方法二,
代码语言:javascript复制if(s == null || s.isEmpty());
方法四:这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多,
代码语言:javascript复制if (s == null || s == "");
注意,s == null这个判断是有必要存在的,如果String类型为null,进行equals(String)或length()等操作会抛出java.lang.NullPointerException。而且s==null的顺序必须出现在前面,不然同样会抛出java.lang.NullPointerException。