Ответ 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.
