类型转换的那些事儿——浅谈.valueOf()与parseDouble() and so on

       在项目中,经常需要对数据类型进行转换,一不小心,一个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? ? ?只能说一句,抱歉,打扰了,有兴趣的可以自己去看看源码。。。

以上就是那些天我遇到的那些坑。。。坑是自己挖的,跳不跳的出来就要看自己了,挖最深的坑,走最长的路。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值