[英]an unexpected NullPointerException in non-taken branch of ternary?
我有两个变量:
final Long a;
if(...) {
a = ...;
} else
a = null;
String b = "A";
....
然后,分配给另一个Long
会引发NullPointerException
:
final Long c = b.equals("B")? a*1000: a;
我期待c
是null
,如果a
是null
的,我很期待b
,我知道不是B
在这种情况下,以防止它被解除引用。
那为什么会抛出NullPointerException
?
更新 :神秘的问题解决了,它在重音运算符中的自动拆箱。 参见https://stackoverflow.com/a/13627200/15721
因为如果a
为null
,则它为Long
,它将被评估为null.longValue()
抛出NullPointerException
编辑:
我希望三元运算符的运算结果是long,因为您正在执行乘法运算,然后即使它在第二个分支上, a
的运算结果也会是long
(未装箱)
Edit2:您更快地找到了自己的答案;)
当您执行a * 1000
, a
被取消装箱。
因此,如果a
为null
,则a * 1000
会引发NullPointerException
!
啊哈,从找到有效的代码后,我可以推断发生了什么:
Long a = ....;
Long b = ... a != null? a*1000: a;
因为a*1000
将a
拆箱,所以时态表达式long
而不是Long
。
Long a = ....;
Long b = ... a != null? new Long(a*1000): a;
保持tenary结果Long
和按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.