Значение для клавиши "B" равно нулю. Но тип возвращаемого значения вашего условного выражения - float (примитив), потому что вы используете литерал 0F
, а не Float (обертка), поэтому значение должно быть автоматически помещено (в примитив) и затем автоматически помещено (обратно в объект). Это приводит к NPE.
Сравните с тем, что происходит при использовании
Float foo = (tm == null ? Float.valueOf(0f) : tm.get(key));
В качестве дополнительного объяснения, вот что делает ваше условное выражение (показывает явный бокс):
Float foo;
float conditionalResult;
if ( tm == null ) {
conditionalResult = 0F;
} else {
conditionalResult = tm.get(key).floatValue(); //this throws the NPE
}
foo = Float.valueOf(conditionalResult);
JLS 15.25 определяет тип возврата условного оператора. Это довольно сложно, и мне легче учиться с помощью экспериментов: -).