When you write
value = condition ? null : 1.0;
the type of condition ? null : 1.0
must be a reference type, so the type is Double
, which can hold the value null
.
When you write
value = condition ? getDouble() : 1.0;
and getDouble()
returns null
, it's equivalent to writing:
value = condition ? ((Double) null) : 1.0;
In this case the compiler sees a Double
and a double
as the 2nd and 3rd arguments of the ternary conditional operator, and decides that type of the expression should be double
. Therefore it unboxes the null
to double
, getting NullPointerException
.
The type of the conditional ternary operator is determined by some tables in JLS 15.25.
If the 2nd and 3rd operands are null
and double
, the conditional expression type is the least upper bound of Double
and null
, which is Double
.
If the 2nd and 3rd operands are Double
and double
, the conditional expression type is double
.