use*_*103 9 java ternary operator-keyword
为什么这段代码有效?
Float testFloat = null;
Float f = true ? null : 0f;
Run Code Online (Sandbox Code Playgroud)
为什么会抛出异常呢?
Float testFloat = null;
Float f = true ? testFloat : 0f;
Run Code Online (Sandbox Code Playgroud)
但最奇怪的是,此代码也成功运行,没有任何例外:
Float testFloat = null;
Float f = testFloat;
Run Code Online (Sandbox Code Playgroud)
似乎Java的三元运算符改变了行为.谁能解释为什么会这样,拜托?
Roh*_*ain 15
如果第二和第三个操作数中的一个是原始类型T的,并且其他的类型是施加装箱转换(§5.1.7)到T的结果,则条件表达式的类型为T.
强调我的.所以,在第二种情况下:
Float f = true ? testFloat : 0f;
Run Code Online (Sandbox Code Playgroud)
由于第3个操作数是基本类型(T),表达式的类型将是float类型 - T.因此,取消装箱的 testFloat当前是一个null参考,float将导致NPE.
至于第一种情况,相关部分是最后一种:
否则,第二和第三操作数分别是S1和S2类型.设T1是将拳击转换应用于S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型.条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果.
所以,根据这个:
null type - S1
float - S2
null type - T1 (boxing null type gives null type)
Float - T2 (float boxed to Float)
Run Code Online (Sandbox Code Playgroud)
然后条件表达式的类型变为 - Float.不需要拆箱null,因此没有NPE.
| 归档时间: |
|
| 查看次数: |
816 次 |
| 最近记录: |