在项目中,经常需要对数据类型进行转换,一不小心,一个NPE就来了,今天做一下笔记,提醒下自己。
以前我一直记得toString()会有问题,容易抛出空指针异常,用String.valueOf()就可以了,所以我就形成了一种思维,对于类型转换,为避免空指针,可以使用.valueOf()这个方法。。。然后,这是大错特错,血和泪的教训告诉我,不能这样乱用。。
对于String.valueOf(),还是可以避免空指针的,但是,他会把null对象转换为null字符串输出,这点要注意,要不然也是一个大坑。。。举个栗子看一下:
public void test() {
Double s = null;
String result = String.valueOf(s);
System.out.println(result);
}
这里会输出null字符串
下面就是固定思维带来的大坑(太菜了,基础好多不熟啊55555):
public void test() {
String s = null;
Double result = Double.valueOf(s);
System.out.println(result);
}
结果。。。。
实践证明,对于Double,Float,Integer使用这种.valueOf()转换null对象,均会报空指针。。
So,How?Why?emmmmm…..看看他们的源码就可以知道,对于传入object的处理是怎样的。
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
String.valueOf()的源码,简单明了,对传入的obj做了判空处理,并且返回的是字符串“null”。实际上,这个里面也是调用了toString()方法,只不过先判空了。再看看Double.valueOf的源码:
第一层调用:
public static Double valueOf(String s) throws NumberFormatException {
return new Double(parseDouble(s));
}
第二层调用:如果直接使用parseDouble(),就没有第一层调用。这里注意一下,parseDouble()返回的是一个基本数据类型double,Double.valueOf()返回的是包装类
public static double parseDouble(String s) throws NumberFormatException {
return FloatingDecimal.parseDouble(s);
}
第三层调用:
public static double parseDouble(String var0) throws NumberFormatException {
return readJavaFormatString(var0).doubleValue();
}
第四层调用:
interface ASCIIToBinaryConverter {
double doubleValue();
float floatValue();
}
第五层调用。。。。WTF? ? ?只能说一句,抱歉,打扰了,有兴趣的可以自己去看看源码。。。
以上就是那些天我遇到的那些坑。。。坑是自己挖的,跳不跳的出来就要看自己了,挖最深的坑,走最长的路。。。