首页
学习
活动
专区
圈层
工具
发布

工作 3 年的同事不懂 isEmpty 和 isBlank 的区别,我真是醉了。

前两天在公司茶水间碰到一个让我直接无语的事。我们组一个工作 3 年的同事,写了个字符串校验工具类,结果用错了方法。更准确地说——他居然分不清isEmpty()和isBlank()的区别。真是当场给我整懵了。

当时的场景是这样的。前端传了个手机号字段,后端要判断是不是空的。结果那哥们写了这么一段代码:

if (phone.isEmpty()) {

  throw new IllegalArgumentException("手机号不能为空");

}

我看了半天,总觉得哪里怪怪的,就随口问了句:“你确定这里用isEmpty()合适?” 他还挺自信地说:“当然啊,字符串为空就抛异常嘛。” 我说:“那你测试下传个空格看看?” 结果他直接愣那了。

其实区别特别简单,但也特别容易被忽略。isEmpty()是用来判断字符串长度是不是 0; 而isBlank()不光判断长度,还会把空格、制表符、换行符之类的都算进去。

简单来说:

String a = "";

String b = "   ";

System.out.println(a.isEmpty()); // true

System.out.println(b.isEmpty()); // false

System.out.println(a.isBlank()); // true

System.out.println(b.isBlank()); // true

所以你看,如果用户在输入框里敲了几个空格,isEmpty()是检测不出来的,而isBlank()就能。

有时候我真觉得这些小细节才是区分“写代码的人”和“写好代码的人”的关键。比如,系统里有很多地方是做输入校验的,如果你漏了空格这种情况,最终存进数据库的就会是一堆看似有值、其实是空白的字符串。日志一查还一头雾水。

更坑的是,有些框架会帮你 trim,比如 Spring MVC 的@RequestParam,有些不会。于是你在不同的接口里看到的行为就完全不一样。那天我们 QA 还问我:“为啥有的接口传空格能过,有的会报错?” 我只能无奈地笑笑:“你得去看谁写的。”

后来我给那哥们讲了个简单的经验: 如果你的需求是“值必须存在”,那就用isBlank(); 如果是“值必须存在,但允许空格是有意义的”,那才用isEmpty()。 举个例子,校验用户名当然要去掉空格; 但如果你处理的是文件内容或者格式化文本,就不能随便 trim。

还有一点挺有意思的:在 Java 11 之前,isBlank()根本没有,只有isEmpty(),所以老项目里一般是这么写的:

if (str == null || str.trim().isEmpty()) {

  // 为空

}

Java 11 后有了isBlank(),就能一行搞定:

if (str == null || str.isBlank()) {

  // 为空

}

是不是清爽多了?所以别嫌升级 JDK 麻烦,这种小功能省下的坑真的多得很。

我最后跟那哥们说:“你知道吗?有时候 bug 不是出在逻辑上,而是出在对语言的不熟悉。” 他笑着说:“是啊,我真以为俩方法是一样的。” 我说:“不怪你,大部分人其实都混着用。只是当项目复杂到一定程度时,这种区别就变成了坑。”

然后我们俩去楼下买咖啡,我还顺手改了那段代码。 结果第二天他在群里发消息:“哥,昨天那个接口 QA 说终于测过了。” 我回了句:“那就好,下次记得——空和空白,不是一个东西。”

说真的,这种看似小题大做的细节,其实是最能体现工程素养的地方。 写代码嘛,怕的不是不会写,而是以为自己懂。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OITRs8AmQuSRAznzHCs4RI7g0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券