背景
最近在回顾自己以往写下的一些代码并修改相关需求,安装后进行相关调试,出现了一个惊人的崩溃闪退现象,一看日志,原来是空指针异常导致的,还是字符串判空的时候出现的空指针,这就纳闷了,赶紧找了一翻资料,把这个问题解决并记录下来。
字符串判空方案
这里先要记录一点,只声明了字符串变量,不给它赋值的话,系统会默认给它赋值null,如:
private String name;
@Test
public void testStr() {
Log.w("hao","name:" + name);
}
输出的结果便是:2020-03-26 15:51:47.703 17792-17815/com.xxx.xxx W/hao: name:null,这个可以说是常识了,但偶尔可能也会犯点小错,把这个臆想为这个空:"",这就有可能酿成大错了。
以下便是Android常用的一些字符串判空方法:
- equals(),我们可能会经常这样用:
if (null != name && !name.equals("")) {
}
组合起来用,如果直接是用 !name.equals("") 就很容易造成崩溃闪退,因为源码的实现是默认了这个name是不为null的,一旦为null,则报空指针异常。
- isEmpty(),这个方法也可以判空:
if (null != name && !name.isEmpty()) {
}
刚开始用这个方法的时候,因为觉得简洁就直接用 !name.isEmpty(),没把前面的加上,结果出现崩溃才发现这个方法使用前也是需要判断字符串是不是为null的,为null时使用和上例一样抛出空指针异常,所以使用时千万要记住加上判断null值。
- length(),这个方法也可以判空:
if (null != name && name.length() > 0) {
}
此方法与上两种方法判空的思路一样,先判null值,否则一旦为null值,还调用 length() 就会抛出java.lang.NullPointerException.
- TextUtils.isEmpty(),这个方法判空比较简洁和安全:
if (!TextUtils.isEmpty(name)) {
}
因为它里面的实现是长这样子的:
/**
* Returns true if the string is null or 0-length.
* @param str the string to be examined
* @return true if str is null or zero length
*/
public static boolean isEmpty(@Nullable CharSequence str) {
return str == null || str.length() == 0;
}
已经为我们进行了null值判断,这样就可以避免空指针异常的出现,也不需要我们手动去判null值。
本文目的是记录项目中因为自己不小心而出现的bug的解决方案,内容简单,如有错误敬请指出批评。