项目中使用String.valueOf(),结果在数据库中存入了 "null" 这个字符串!!!!!
测试如下:
溯源:String.valueOf()被重载了多次,其中包含基本数据类型,包装类,和char数组。
重载的方法,默认会选择精度更高的。比如两个重载方法入参分别是List和ArrayList,那么调用的时候,会走ArrayList。
重载的数据。
public static String valueOf(Object obj) {return (obj == null) ? "null" : obj.toString();
}public static String valueOf(char data[])public static String valueOf(char data[], int offset, int count)public static String valueOf(boolean b)public static String valueOf(char c) public static String valueOf(int i)public static String valueOf(long l)public static String valueOf(double d)
当我们代码中写到,获取某个对象的值,这是很常见的业务场景。
Map<String, String> map = new HashMap<>();String tmp = String.valueOf(map.get("test"));// test 是一个不存在的key
但是此时key可能不存在,value也必然不存在,结果就是null
String.valueOf(),就会走Object。
源码可以看到,判断为null,就返回"null"。这样就导致数据库存了一个"null"字符串。
public static String valueOf(Object obj) {return (obj == null) ? "null" : obj.toString();}
总结,以后尽量在业务之前判空。
既然String.valueOf()底层也是toString(),为什么不直接用toString()???
- String.valueOf()还重载了基本数据类型,基本数据类型不能toString(),
- 避免了null的情况,null调用toString(),会报错。
- 但也正是因为不会报错,所以他返回了一个"null"字符串,这就需要我们自己判断了。