三目运算符下的空指针异常和自动拆装箱

这是一段会报空指针异常的代码:

Double a=Double.valueOf(1);
Float b=null;
String c="123";
a=c.equals("123")?b:a;
在这个例子里变量b并不能成功的把null赋值给变量a,而是抛出了空指针异常

虽然b是Float类型,a是Double类型,但是三目运算符的编译并不会报错

虽然编译不报错,但是会有警告,说变量b是null但是还要拆箱


 

使用三目运算符时,如果出现类型不一致,java会使用自动拆装箱的机制

类型不一致时java会拆箱成基本类型,也就是把Double变成double,Float变成float,然后用valueOf方法进行处理

自动拆装箱是JDK1.5引入的,由编译器来支持,上面例子的class文件反编译出来的结果是这样的:

Double a = Double.valueOf(1.0D);
Float b = null;
String c = "123";
a = Double.valueOf(c.equals("123") ?b.floatValue() : a.doubleValue());
变量b拆箱成了b.floatValue(),这也就是空指针异常的来源

 

虽然有自动拆装箱,但是直接把Float对象赋值给Double对象,编译是不能通过的,就像这样:

Double d=Double.valueOf(1);
Float e=d;//该行编译不通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值