奇怪的Java行为。三元运算符
该行为在JLS-条件运算符中指定:
如果第二和第三个操作数中的一个是原始类型T的,并且其他的类型是施加装箱转换(§5.1.7)到T的结果,则 。
强调我的。因此,在第二种情况下:
Float f = true ? testFloat : 0f;
由于第三个操作数是基本类型(T),因此表达式的类型将是浮点类型- T。因此, 取消 当前引用的 testFloat的 装箱 将导致NPE 。null``float __
对于第一种情况,相关部分是最后一部分:
否则,第二和第三操作数分别为S1和S2类型。令T1为对S1进行装箱转换所产生的类型,而T2为对S2进行装箱转换所产生的类型。条件表达式的类型是将捕获转换(§5.1.10)应用于lub(T1,T2)(§15.12.2.7)的结果。
因此,根据此:
null type - S1float - S2null type - T1 (Boxing null type gives null type)Float - T2 (float Boxed to Float)
然后条件表达式的类型变为- Float。没有null需要的拆箱,因此没有NPE。
解决方法为什么此代码有效?
Float testFloat = null;Float f = true ? null : 0f;
为什么这会引发异常?
Float testFloat = null;Float f = true ? testFloat : 0f;
但是最奇怪的是,该代码也可以成功运行,没有任何异常:
Float testFloat = null;Float f = testFloat;
看来Java的三元运算符会改变行为。有人可以解释为什么吗?
相关文章:
1. javascript - sublime左边栏的字体能放大吗?2. 第77行说非对象调用函数fetch()那位大牛解释一下 实在找不到3. javascript - requestAnimationFrame如何控制帧速?4. Python使用mysqldb连接mysql抛出errorclass errorvalue?5. javascript - 请问js(非jq)中如果获取元素的高度精准到小数位6. javascript - webstorm 创建json文件问题7. 安装sublime text 3 控制台的时候出现这个报错怎么办?8. javascript - 有一个异步获取数据的函数A,其他依赖这个A得到的数据的函数是否都必须是异步的?9. javascript - html5多个label中其中一个触发change,如何判断是哪一个出发了change10. (JAVA)最近在做到支付宝的一码多付支付接口,发现没有异步回调通知,需要自己轮询查询订单状态,这个需要怎么实现?

网公网安备