这非常微妙.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; } }