繁体   English   中英

三元的未采用分支中意外的NullPointerException?

[英]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;

我期待cnull ,如果anull的,我很期待b ,我知道不是B在这种情况下,以防止它被解除引用。

那为什么会抛出NullPointerException

更新 :神秘的问题解决了,它在重音运算符中的自动拆箱。 参见https://stackoverflow.com/a/13627200/15721

因为如果anull ,则它为Long ,它将被评估为null.longValue()抛出NullPointerException

编辑:

我希望三元运算符的运算结果是long,因为您正在执行乘法运算,然后即使它在第二个分支上, a的运算结果也会是long (未装箱)

Edit2:您更快地找到了自己的答案;)

当您执行a * 1000a被取消装箱。

因此,如果anull ,则a * 1000会引发NullPointerException

啊哈,从找到有效的代码后,我可以推断发生了什么:

Long a = ....; 
Long b = ... a != null? a*1000: a;

因为a*1000a拆箱,所以时态表达式long而不是Long

Long a = ....; 
Long b = ... a != null? new Long(a*1000): a;

保持tenary结果Long和按预期工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM