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

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

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;//该行编译不通过

你可能感兴趣的:(Java)