Ответ 1
Это очень тонко. Float.parseFloat
возвращает float
, а не float
. Вторые два операнда условного оператора должны быть одного типа, но вы даете ему float
(результат Float.parseFloat
) и float
(def
). Компилятор выбирает float
, потому что float
можно принудительно выполнить с помощью float
с помощью автоматической распаковки.
Итак, что выводит компилятор, как будто вы написали это:
private static Float toFloat(Float def, String str) {
try {
return str != null ? Float.parseFloat(str) : def.floatValue();
// Note ----------------------------------------^^^^^^^^^^^^^
} catch (NumberFormatException e) {
return def;
}
}
... и, конечно, вызов floatValue
на null
вызывает NPE.
Вы можете исправить это, убедившись, что тип второго операнда float
, а не float
. Много способов сделать это, но как указывает Zefick , самым простым является Float.valueOf(String)
:
private static Float toFloat(Float def, String str) {
try {
return str != null ? Float.valueOf(str) : def;
} catch (NumberFormatException e) {
return def;
}
}