前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【开发常识】这个问题,直接导致年终奖没了……(惨兮兮)

【开发常识】这个问题,直接导致年终奖没了……(惨兮兮)

作者头像
田维常
发布2020-12-30 15:12:37
3130
发布2020-12-30 15:12:37
举报

关注“Java后端技术全栈”

回复“面试”获取全套面试资料

在项目中,我们基本上都会有个StringUtils工具类,用来处理字符串相关的操作,比如:判空,长度,脱敏等。

今天有个小伙伴,因为调用别人提供的接口,接口里返回参数中有个String类型的。

小伙伴判空使用的是isEmpty()方法(大多数人认为这个方式没问题)。

但是问题来了:

接口返回的String类型参数不是空字符串,是个" "这样的字符串。

这个isEmpty方法居然返回成了false,那就是没问题了,校验通过了,然后入库了。于是后面的业务逻辑就乱了,接着整条业务线都被坑惨了!他的年终奖也就这么凉凉了~

其实我们在项目中处理方式一般有两种:

一种是自定义工具类,这个我们就不扯了。另外一种是使用第三方的工具类,比如:

commons-lang3

org.apache.commons.lang3.StringUtils

代码语言:javascript
复制
public static boolean isEmpty(final CharSequence cs) {
      return cs == null || cs.length() == 0;
}
public static boolean isBlank(final CharSequence cs) {
    final int strLen = length(cs);
    if (strLen == 0) {
        return true;
    }
    for (int i = 0; i < strLen; i++) {
        if (!Character.isWhitespace(cs.charAt(i))) {
            return false;
        }
    }
    return true;
}

spring-core中

org.springframework.util.StringUtils

代码语言:javascript
复制
//判断是否为空
public static boolean isEmpty(Object str) {
  return (str == null || "".equals(str));
}
//判断是否由内容
public static boolean hasText(String str) {
  return (str != null && str.length() > 0 && containsText(str));
}

分析

上面两个第三方工具类的中isEmpty()方法判断是否为空,但是会有问题:如果其中存在" "这种字符串的时候,空白字符串是会认为不是空(业务代码中基本上都会把空白字符串处理成空,除非有非常特殊情况)。

isBlank()判断是否为空,处理了" "这种场景。所以如果项目中使用的是org.apache.commons.lang3.StringUtils时,建议使用isBlank()方法

hasText()方法是判断是否存在内容,也处理了" "这种字符串,但是需要注意hasText()方法的返回值和isBlank()方法返回值是相反的。

示例

使用isEmpty()方法和isBlank()方法:

代码语言:javascript
复制
import org.apache.commons.lang3.StringUtils;

public class StringUtilDemo {
    public static void main(String[] args) {
        String name = "";
        String name0 = " ";

        System.out.println(StringUtils.isEmpty(name));
        System.out.println(StringUtils.isEmpty(name0));

        System.out.println(StringUtils.isBlank(name));
        System.out.println(StringUtils.isBlank(name0));
    }
}

输出:

代码语言:javascript
复制
true
false
true
true

空白字符串就认为不是空了,但是往往我们在业务代码处理过程中,也需要把空白字符串当做是空来处理,所以在使用的时候回留点心。

但是isBlank()方法却避免了这种空白字符串的问题。

使用isEmpty()方法和hasText()方法:

代码语言:javascript
复制
import org.springframework.util.StringUtils;

public class StringUtilDemo {
    public static void main(String[] args) {
        String name = "";
        String name0 = " ";

        System.out.println(StringUtils.isEmpty(name));
        System.out.println(StringUtils.isEmpty(name0));

        System.out.println(StringUtils.hasText(name));
        System.out.println(StringUtils.hasText(name0));
    }
}

输出:

代码语言:javascript
复制
true
false
false
false

isEmpty()方法也会把空白字符串当做不是空字符串。但是hasText()方法却能避免空白字符串的问题。

总结

永远不要指望别人返回来的字符串绝对没有空白字符串。

不是不推荐使用isEmpty(),而是看你的业务代码里是否把空白字符串当做空字符串来处理。

如果空白字符串是按照空字符串查来处理,那么推荐使用isBlank()方法或者hasText()方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • commons-lang3中
  • spring-core中
  • 分析
  • 示例
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档