-1

我有两个变量:

final Long a;
if(...) {
     a = ...;
} else
     a = null;
String b  = "A";
....

然后,分配给另一个Long是抛出一个NullPointerException

final Long c = b.equals("B")? a*1000: a;

我期待cnullif ais null,并且我期待b,我知道在这种情况下不会B阻止它被取消引用。

那么它为什么会抛出NullPointerException?

更新:谜团解开了,它在三元运算符中自动拆箱。见https://stackoverflow.com/a/13627200/15721

4

3 回答 3

3

因为 if ais null,因为它是 aLong它会评估为null.longValue()抛出 aNullPointerException

编辑:

我希望三元运算符的计算结果为 long,因为您正在进行乘法运算,然后即使它进入第二个分支,a也会被评估为 a long(unboxed)

Edit2: 您最终找到自己的答案的速度更快;)

于 2012-11-29T13:38:33.923 回答
1

当你这样做时a * 1000a被拆箱。

因此如果anull,则a * 1000抛出一个NullPointerException

于 2012-11-29T13:38:45.347 回答
1

啊哈,通过找到有效的代码,我可以推断出正在发生的事情:

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

因为a*1000a开箱,十元表情long不是Long

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

保持最终结果Long并按预期工作。

于 2012-11-29T13:46:57.127 回答