Ответ 1
Когда вы пишете
value = condition ? null : 1.0;
тип condition? null: 1.0
condition? null: 1.0
должен быть ссылочным типом, поэтому тип Double
, который может содержать значение null
.
Когда вы пишете
value = condition ? getDouble() : 1.0;
и getDouble()
возвращает null
, что эквивалентно записи:
value = condition ? ((Double) null) : 1.0;
В этом случае компилятор видит Double
и double
как 2-й и 3-й аргументы тернарного условного оператора и решает, что тип выражения должен быть double
. Поэтому он освобождает значение null
до double
, получая NullPointerException
.
Тип условного тернарного оператора определяется некоторыми таблицами в JLS 15.25.
Если 2-й и 3-й операнды равны null
и double
, тип условного выражения является наименьшей верхней границей Double
и null
, которая является Double
.
Если 2-й и 3-й операнды Double
и double
, тип условного выражения double
.