咱们今天聊个日常开发里特容易踩的坑——用StringUtils.isBlank做判断时,你以为的“空”可能根本不是你想的那样。尤其是从Map里取值的时候,稍不注意就出问题,我给你掰开了揉碎了讲讲。先看段代码,咱们就从这代码说起:
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
public class MapValueTest {
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
map.put("name", ""); // 放了个空字符串
// 注意,这里没放"age"这个key
// 堆代码 duidaima.com
String name = String.valueOf(map.get("name"));
String age = String.valueOf(map.get("age"));
if (StringUtils.isBlank(name)) {
System.out.println("name is null");
}
if (StringUtils.isBlank(age)) {
System.out.println("age is null");
}
}
}
你猜这段代码输出啥?估计不少人会说,俩判断都成立,会打印两行。其实结果是只有name is null 打印了出来。为什么呢?先看name这块。map.get("name")取到的是咱们放进去的空字符串"",然后用String.valueOf转一下。这里要记牢,String.valueOf处理空字符串的时候,返回的还是空字符串""。那StringUtils.isBlank("")呢?它会返回true,因为isBlank会把空字符串当成“空”来处理,这部分还好理解。
关键在age这里。map.get("age")因为没有这个key,所以返回null。这时候String.valueOf(null)就有意思了,它返回的不是null,而是字符串"null"(就是带引号的那俩字)。那StringUtils.isBlank("null")会返回啥?答案是false!
为啥会这样?咱们得把几个关键点拎清楚:
第一,String.valueOf()的处理逻辑。它对null的处理很特殊,不是返回null,而是返回字符串"null";但如果输入是"",返回的还是""。这一点要是记不住,转换的时候就容易出问题。看源码你就知道了:

String.valueOf()的主要使用场景是将对象 “字符串化”(比如打印、日志输出、字符串拼接等)。当我们需要把null转换成字符串时,直观上希望得到一个能 “表示 null” 的字符串,而不是让程序崩溃。
第二,StringUtils.isBlank和StringUtils.isEmpty的区别。isEmpty只看是不是null或者长度为0,比如isEmpty("")是true,isEmpty(" ")是false(因为有空格,长度不是0)。而isBlank更严格,除了null和空字符串,连全是空格、制表符这些空白字符的字符串也会判定为true,比如isBlank(" ")就是true。但不管是isBlank还是isEmpty,对"null"这个字符串的判断都是false,因为它有实际内容。
第三,Map取值的情况。当key不存在时,Map的get方法返回null,这时候如果直接用String.valueOf转换,就会得到"null",这时候再用isBlank判断,结果就是false,但咱们可能误以为这里应该是“空”,这就埋下了bug。
那实际开发中该咋处理呢?给你几个小建议:
先做null检查。从Map里取到值之后,先看看是不是null,再进行转换。比如:
Object ageObj = map.get("age");
if (ageObj == null) {
// 处理key不存在的情况
} else {
String age = String.valueOf(ageObj);
// 后续处理
}
用Optional优雅处理。Java 8之后的Optional能帮咱们简化代码,还能避免空指针:
String age = Optional.ofNullable(map.get("age"))
.map(Object::toString)
.orElse(""); // 不存在就给个默认值空字符串
if (StringUtils.isBlank(age)) {
// 处理空的情况
}
别滥用String.valueOf。如果不确定取值结果,先判断再转换,避免把null变成"null"。总的来说,就是要清楚每个方法的行为,特别是边界情况,这样才能写出靠谱的代码。你平时开发中遇到过类似的坑吗?