你真的会判断对象是否为空吗?

简介: 一个小小的判空,却很可能让你吃了大亏,如果一个判空没有做好,那么里面的逻辑就完全裸露了,相信你一定吃过 `NullPointerException` 的苦头!

首先,这个问题就很有意思,相信大部分人第一反应不就是null吗?

比如:

if(str != null){

}

可是,很多时候我们判断前端送过来的值,有可能是空字符串,所以更严格的写法是:

if(str != null && !str.equals("")){

}

眼疾手快的同学肯定发现了问题,如果strnull怎么办?

其实就算是null也没关系,因为前面已经判断了不为null,&&是短路与,如果前面的条件不是true,后面的压根不会执行。

于是,这段代码成了很多公司的首选。

有人问,为什么要判断是不是空字符串,我不判断行不行。

有些情况行,但是很多情况就是不可以。

比如你看这里的代码:

if(userNo != null){
  User user = userMapper.selectOne(userNo);
  log.info(user.userName);
}

如果传过来的就是一个空字符串,那么是会进入这个逻辑的,查出来的usernull,在user.userName的时候就会报空指针。

个别头铁的同学又会问,那我抛出异常不就行了。

if(userNo != null && userNo.equals("")){
  User user = userMapper.selectOne(userNo);
  if(user == null){
    throw new Exception("用户不存在!");
  }
  log.info(user.userName);
}

乍一看是没问题,但是你细品,问题就大了。
比如我的业务场景是,用户存在就增加积分,用户不存在就创建这个用户。

看代码:

if(userNo != null){
  User user = userMapper.selectOne(userNo);
  if(user == null){
    throw new Exception("用户不存在!");
  }
  addPoints(user,100);
}else{
  addUser();
}

代码的本意是,有userNo我就给他加积分,没有userNo就去新增这个用户。

现在你传了一个空字符串过来,意思是空,却走进了加积分的逻辑。就算报错,可真的是客户想要的吗?客户是希望,我没有用户账号,你给我新增一个。

所以这就与业务相悖了。

好了,我其实会读心术,你此刻也许在想,那我随便传一个找不到的userNo给你,你不还是走不到addUser的逻辑吗?

亲,你传个空字符串和null的本意肯定是,这个东西我没有。但是你传一个错误的数据,那性质就不一样了,意思是我有这个东西,但是我填错了。那么这样的逻辑自然就没有问题啦。

所以,我们要牢记,如果业务上这个东西的概念是一个空,就一定要既判断null,还要判断空字符串,双管齐下才能确保万无一失。

当然,实际上这么常见的功能,我们大可以使用org.apache.commons.lang3.StringUtilsisNotBlank方法:

isNotBlank

    public static boolean isNotBlank(CharSequence cs) {
        return !isBlank(cs);
    }

isBlank

public static boolean isBlank(CharSequence cs) {
        int strLen = length(cs);
        if (strLen == 0) {
            return true;
        } else {
            for(int i = 0; i < strLen; ++i) {
                if (!Character.isWhitespace(cs.charAt(i))) {
                    return false;
                }
            }

            return true;
        }
    }

length

    public static int length(CharSequence cs) {
        return cs == null ? 0 : cs.length();
    }

它不仅帮你判断了null和空字符串,还给你判断了空格,简直不要太爽!

一个小小的判空,却很可能让你吃了大亏,如果一个判空没有做好,那么里面的逻辑就完全裸露了,相信你一定吃过 NullPointerException 的苦头!

相关文章
|
6月前
|
Python
晶闸管阴阳极的判断
晶闸管阴阳极的判断
153 0
|
6月前
|
算法 前端开发
3039. 进行操作使字符串为空
3039. 进行操作使字符串为空
51 0
|
1月前
|
前端开发 JavaScript
判断数组为空的方法有哪些?
本文介绍了多种判断数组是否为空的方法,包括使用 `length` 属性、隐式类型转换、`toString()`、`join()`、`every()`、`reduce()`、`filter()`、`some()` 方法以及循环。每种方法都有其适用场景,其中使用 `length` 属性和隐式类型转换最为常见和简单。文章首发于微信公众号“前端徐徐”。
112 2
判断数组为空的方法有哪些?
|
2月前
|
JavaScript
判断一个对象为空对象的方法
判断一个对象为空对象的方法
32 4
|
6月前
|
C++
c++判断
c++判断
40 1
|
6月前
|
C语言
C判断
C判断
42 0
|
6月前
|
算法 前端开发 索引
判断对象是否为空
判断对象是否为空
65 0
|
程序员 C语言
C 判断
C 判断。
45 0
|
索引
判断字符串回文
判断字符串回文
60 0