null == a or a == null 及java String 非空判断

时间:2022-05-15 20:59:22

今天在论坛上看到一个帖子,讨论的是null == 和 == null的区别,比较多的人都说是没有区别的。其中有一个人说因为写了 == null而被头说了,下面便一堆人说这个头不懂技术。今天,我就这个问题说下自己的看法。

首先,把这个问题一般化,即将变量与常量做比较时,常量写在等式左边好还是右边好?

常量== 变量是一样良好的编程习惯,可以避免出错一些不必要bug((在少写了个=的进时候)。当然这一点在java里已经没有那么明显了,但还是可以证明的,请看以下代码:

在变量 == 常量情况下:

boolean istrue = false;
 //如果istrue为false则输出失败
if(istrue == false){
     System.out.println("失败");
}
 
以上代码没有出现语法和逻辑问题,再看以下代码(一不小心写少了个=): 

boolean istrue = false;
//如果istrue为false则输出失败
if(istrue = false){
    System.out.println("失败");
}
这时候问题就比较严重了,这段代码没有语法错误,没有编译和运行时的错误,但它的逻辑却出了错!!!

我们再来看常量 == 变量的情况:

boolean istrue = false;
//如果istrue为false则输出失败
if(false == istrue){
     System.out.println("失败");
}
首先这样也是不会出现问题的,再来看下面(一不小心写少了个=)

null == a or a == null 及java String 非空判断

很明显出错了语法错误了!!!

当然以上的例子在java没有意义,因为更多的时候我们在if中的boolean类型不会使用==,而且java中的if语句只能使用类型,所以说以上的问题在java中基本不会出现,但是,在其他的语言中会出错,比如C,下面我们就看下C出现的问题。

我们知道,在C中,if语句中的值,0这假,非0为真,也就是说if语句中可以是非bool类型的数值,以下C代码没有语法错误,逻辑上却是错了。

int vis = 0;
//如果vis等于0输出
if(vis = 0){
     printf("成功");
}
综上所述,使用常量 == 变量的原因与java中语法糖-泛型一样,可以将错误提前到编译时出现(在小写个=的情况下),不管如何,这也是一种良好的编程习惯。


对于这种情况在java上更多的表现为null == string与string == null,在企业中,基本上所有的代码只有null == string这种判断,与此相关的,是String的equals方法,怎样判断一个string 是不是""呢?严谨的做法是"".equals(str)而不是str.equals(""),在我学生时期我时常是使用后者,使用前者的原因是在str为null的情况下,后者会抛空指针异常。同理,我们在使用String的isEmpty方法时要注意,一定要进行非空判断,以下是isEmpty方法的源码:

null == a or a == null 及java String 非空判断

null == a or a == null 及java String 非空判断

可以看出,isEmpty只是通过比较str的长度,甚至没有进行.trim()的处理,使用要相当小心,所以,如果你要自己封装工具进行判断,可以使用以下方法:

null == a or a == null 及java String 非空判断

这里使用str.trim()的原因是若null == str则str.trim()不会执行,也就是说str.trim()不会出现String的空指针。


好了,以上就是今天分享的全内容,由于是个人经验总结,难免会出错,欢迎大家批评指正,万般感谢。