String的null或空值的判断处理
isEmpty() 分配了内存空间,值为空,是绝对的空,是一种有值(值 = 空)
"" 分配了内存空间,值为空字符串,是相对的空,是一种有值(值 = 空字串)
null 是未分配内存空间,无值,是一种无值(值不存在)
简单总结几个方法:
1.直观的:
if(s == null ||"".equals(s)); //先判断是否对象,再判断是否是空字符串
2.比较字符串长度, 效率高, 比较绕:
if(s == null || s.length() <= 0);
3.效率和方法二几乎相等, 但出于兼容性考虑,不建议此方法.
if(s == null || s.isEmpty());
4.看起来高大上的:
if(StringUtils.isNotBlank(str)) //判断字符串不为空
if(StringUtils.isBlank(str)) //判断字符串为空
判断一个String为空的安全方法,string == null || string.isEmpty()
isEmpty()完全等同于string.length()==0
如果String对象本身是null,即字符串对象的引用是空指针,那么使用string.isEmpty()会报NullPointerException
例子:
//字符串对象的引用a是有效指针,字符串对象a分配内存空间,并且指向的内容为空字符串(在java没有指针的说法,但这样理解更好)
String a = new String();
//字符串对象的引用b是有效指针,字符串对象b分配内存空间,并且指向的内容为空字符串
String b = "";
//字符串对象的引用c是空指针, 字符串对象c未分配内存空间
String c = null;
isEmpty()使用的前提是字符串对象已经被分配了内存空间,如果对象没有被分配空间而使用isEmpty()报空指针错误,isEmpty等同于string.length()==0,比如对字符串对象的引用c: c.isEmpty(),报NullPointException,而字符串对象的引用a,b都不会。
一、基本知识
String str1 = null;
str1引用为空,它没有地址,它是一个没有被实例化的对象
String str2 = "";
str2引用为空字符串,它有地址,它是被实例化的对象,值为空而已。
二、实际问题
在开发过程中,常常碰到过下面这些错误的用法:
1,错误用法一:
if (name == "") {
//do something
}
2,错误用法二:
if (name.equals("")) {
//do something
}
3,错误用法三:
if (!name.equals("")) {
//do something
}
我们来解说一下:
上述错误用法1是初学者最容易犯,也最不容易被发现的错误,因为它们的语法本身没问题,Java编译器编译时不报错。但这种条件可能在运行时导致程序出现bug,永远也不会为true,也就是时说,if块里的语句永远也不会被执行。
上述用法二,用法三 的写法,是包括很多Java熟手也很容易犯的错误,它们的写法本身没错,但是,少了一个null判断的条件,试想,如果name=null的情况下,会发生什么后果呢?后果是,你的程序将抛出NullPointerException异常,系统将被挂起,不再提供正常服务。
当然,如果之前已经对name作了null判断的情况例外。
正确的写法应该先加上name != null的条件,如例:
if (name != null && !name.equals("")) {
//do something
}
或者
if (!"".equals(name)) {//将""写在前头,这样,不管name是否为null,都不会出错。
//do something
}
三、判断是否为空
1、如果是string对象是null,用 == 来判断,否则会抛出异常
java.lang.NullPointerException
2、如果是空字符串,用来equals() 判断,
str.equals("")
“ == ”操作在对String这种引用数据类型来说,比较的是地址
“equals()"判断的是内容
3、综合来说,判断字符串是否为空
if (context != null && !context.trim().equals("")) {
trim():返回一个去掉前后空格之后的 字符串(leading and trailing whitespace)
四、判断是否相等
str1.equals(str2)
“ == ”操作在对String这种引用数据类型来说,比较的是地址
“equals()"判断的是内容
!String.equlas("String");