我想大家在开发过程中遇到最多的问题便是NullPointerException
即空指针异常了吧,空指针异常一般分为以下几种情况:
- object对象为
null
,为null的情况大多数都是上一步的查询方法没有查到结果,此时通过object来get其中的属性的时候会报异常 - 对象集合为空,然后
get(0)
或者遍历的时候没有获取到对象 - 字段值为null,此时又拿次字段去做比较还是什么,也会报异常
现在对常见情况进行详解
- 对象为空的话我们常用的就是以下方式jdk的util包里的方法
java
复制代码
Objects.isNull(obj)
Objects.nonNull(obj)
obj != null
obj == null
- 集合为空的话最常用的就是Spring里带的方法
java
复制代码
CollectionUtils.isEmpty(list)
list.size() > 0
- 字段值为null的时候常用的是
java
复制代码
Strings.isBlank(str)
StringUtil.isEmpty(str)
StringUtils.isBlank(str)
前两种判空我就不做讲解了,下面就是着重讲一下第三种关于一些字段的判空
一般字段为空判断的都是String
类型,或者数据库字段设置默认值为null或者空字符串 这个时候我们需要对字符串做处理,例如进行正则匹配什么的,如果是null
或者是空字符串的话就会有问题,有一小部分人可能习惯了isEmpty
方法,但是这种情况会很容易出现空字符串的问题,这个时候系统就会报异常了。下面我来给大家看一下两个方法的区别:
1.Strings.isBlank(str) –org.apache.logging.log4j.util 包
我们可以看到方法底层有两种判断方式,前面的就是我们常见的等于null判断,后面的方法我们先看一下trim()方法:
源码具体的作用也是对字符串的前后部分的空格做了处理,删除了字符串最前面和尾部的空格,将中间的字符串包含空格(这个空格不是前面或者后面的空格)返回。 将字符串进行
trim()
方法处理空格后便进行isEmpty()
方法处理了:
2.StringUtilS.isEmpty(str) —org.apache.commons.lang3 包
编辑 此时我们看一下apache的lang包下的判空少了个空格的处理,
3.StringUtils.isBlank(str) –org.apache.commons.lang 包(下面这位jy提出)
这里我点开了源码进行查看
这里我们会发现在源码里先判空处理,如果为空则直接返回,不为空的话会对字符串进行遍历,从第一个字符进行判断是否为空字符,知道遍历结束,如果中间出现一个不为空的字符则直接返回结果。
下面我贴出后续源码(由于个人能力有限,无法做出详细解释)
这里我自己去测试了下两个方法的耗时情况,也在大佬的建议下明白了自己的问题,由于自己只是简单测试了一下,结果并不具有代表性,所以就不贴出来了,不过还是推荐JY提供的第三种方法去进行判空操作!
再补充一点:我们很多系统中都会有很多过滤条件,例如单号或者什么的也有很多是string类型的,我们在后台接收参数的时候可以先通过trim()
方法将操作人误操作的前后空格给处理掉,然后再将处理后的参数放到筛选条件中进行筛选,这样保证用户的体验性。
2022-12-8:今天发现了一个不错的判空方式,可以同时判断多个字符串,减少我们去写多个if
语句进行判断:
其实也是apache里的lang3包下的StringUtils
类里:
scss
复制代码
StringUtils.isAnyBlank(str1,str2,...)//里面可以写多个参数,也可以写一个参数
StringUtils.isAllBlank(str1,str2,...)
见名知意
StringUtils.isAnyBlank(...)
这个方法的含义是:如果里面的字符串参数有一个是空字符串或者都是空格字符串则会返回ture
。StringUtils.isAllBlank(...)
这个方法的含义是:如果里面的字符串参数全都是空字符串或者空格字符串则会返回true
。
这种多参判断的方式可以减少我们if语句的判断,例如登陆的时候判断账号和密码,如果二者有其一没有填写就可以直接给用户一个提示:请填写用户名或密码!