Java自动拆箱陷阱。 谨防!

您认为以下代码段会显示什么?

Object o = true ? new Integer(1) : new Double(2.0);
System.out.println(o);

是! 它将打印:

1.0

什么? 1.0? 但是我已经为我的o变量分配了一个Integer 。 为什么打印1.0? 事实证明,JLS的§15.25中有一个微妙的小规范部分,它指定了三元运算符。 以下是适用于以上内容的内容:

条件表达式的类型确定如下:

  • […]
  • 否则,如果第二个和第三个操作数具有可转换为数字类型(第5.1.8节 )的类型,则有以下几种情况:
    • […]

二进制数值提升可能会隐式执行拆箱转换! ek! 谁会想到这个? 您可以从自动拆箱中获取NullPointerException,如果其中一个操作数为null ,则以下操作将失败

Integer i = new Integer(1);
if (i.equals(1))
    i = null;
Double d = new Double(2.0);
Object o = true ? i : d; // NullPointerException!
System.out.println(o);

显然(显然!!),可以通过将数字类型转换为非数字类型来规避此问题,例如Object

Object o1 = true 
  ? (Object) new Integer(1) 
  : new Double(2.0);
System.out.println(o1);

上面将打印

1

保罗·米纳(Paul Miner)是发现这一难题的功劳,他在reddit上对此进行了更详细的解释。

参考: Java自动拆箱陷阱。 谨防! 从我们的JCG合作伙伴 Lukas Eder在JAVA,SQL和JOOQ博客中获得。

翻译自: https://www.javacodegeeks.com/2013/10/java-auto-unboxing-gotcha-beware.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值