业务场景:
查询区域列表接口,为了提高接口TPS,选择将列表数据加入缓存。
1、请求该接口时,首先查询redis,如果redis不为空,则获取redis中key对应的value值,转换为特定结构返回前端。
2、如果redis为空,则查询数据库,再将所查询到的数据存入redis,设置过期时间。
问题描述:
然而请求进来查询redis时,redis没有对应key值,按逻辑来讲应该查询数据库,而不是直接报错空指针。
解决:
更换为StringUtils.isEmpty()方法进行校验。
总结:
是因为在判断redis中是否存在对应数据时使用了,if (stringDataKey.isEmpty()) 来进行校验是否为空,但是在使用isEmpty时前提是stringDataKey字符串本身不能为null,没有 "null.isEmpty()"这个方法,导致了空指针。
随后更换为StringUtils.isEmpty(stringDataKey)解决。它一般会先去检查传入的参数是否为 null
,如果是 null
,直接就判定为空(符合我们对于 "空" 的一种常规理解,也就是没有值嘛),然后返回 true
;如果参数不为 null
,才会进一步去看这个字符串的长度是不是等于 0
,综合这两种情况(null
或者长度为 0
的字符串)来确定是否为空字符串,这样无论传入的 stringDataKey
是 null
还是实实在在的空字符串,都能正确地进行判断,避免了出现空指针异常的情况