鉴于今天在写一个字符串重载StringUtil.isEmpty(String str)时,因为没有找到入参为Object校验非空的方法,于是觉得有必要写一个,这个悲伤的故事由此开始。
// 刚开始的想法
public static boolean isNotEmpty(Object obj){
return !isEmpty(String.valueOf(obj));
}
public static void main (String[] args){
String str1 = "";
String str2 = " ";
String str3 = null;
String str4 = " 23 ";
System.out.println("str1:预期:false;实际:"+isNotEmpty(str1));
System.out.println("str2:预期:false;实际:"+isNotEmpty(str2));
System.out.println("str3:预期:false;实际:"+isNotEmpty(str3));
System.out.println("str4:预期:true;实际:"+isNotEmpty(str4));
}
上述代码的运行结果如下:
str1:预期:false;实际:false
str2:预期:false;实际:false
str3:预期:false;实际:true
str4:预期:true;实际:true
在Obj为null时,输出不对?于是打开String.valueOf(Object obj)源码一看,原来在对象转换时,null被转换成了字符串类型的"null",而不是返回null。
特此记录一下,加深印象;下面附上String类钟的源码:
/**
* Returns the string representation of the {@code Object} argument.
*
* @param obj an {@code Object}.
* @return if the argument is {@code null}, then a string equal to
* {@code "null"}; otherwise, the value of
* {@code obj.toString()} is returned.
* @see java.lang.Object#toString()
*/
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
每个错误都有被记录的价值