Why does the following line of code produce a NullPointerException
?
Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
I understand that unboxing is being performed on null
, but why?
Note that
Long v = (Long) null;
Does not produce the Exception.
So it looks obvious that you only have to box if the condition is true, and there should be no boxing if the condition is false. However the ternary operator expression must have a particular static type. So we have
Long
andlong
. The JLS states that the result will be the primitive (just as well - imagine if the operator was, say,+
or even==
). So the ternary operator will force the unboxing, and only then does the assignment cause a boxing.If you were to replace the code with the equivalent
if-else
, then you'd just have an assignment fromlong
toLong
and fromLong
toLong
, which wouldn't have any unboxing and so run fine.IIRC, this is covered is Bloch & Gafter's Java Puzzlers.
From the JSL
In following statement the type of second operand is
long
and third isLong
.This will work if an expression is true.
Or you may cast it.