这个程序应该在用 null 调用 toFloat 时避免 null。 但我仍然得到 NPE ..任何帮助
System.out.println(toFloat(null, null));
private static Float toFloat(Float def, String str) {
try {
return str != null ? Float.parseFloat(str) : def;
} catch (NumberFormatException e) {
return def;
}
}
最佳答案
这是非常微妙的。 Float.parseFloat
返回 float
,而不是 Float
。条件运算符的后两个操作数必须是同一类型,但您给它 float
(Float.parseFloat
的结果)和 Float
(定义
)。编译器选择 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;
}
}
...当然,在 null
上调用 floatValue
会引发 NPE。
您可以通过确保第二个操作数的类型是 Float
而不是 float
来修复它。有很多方法可以做到这一点,但正如 Zefick points out ,最简单的是Float.valueOf(String)
:
private static Float toFloat(Float def, String str) {
try {
return str != null ? Float.valueOf(str) : def;
} catch (NumberFormatException e) {
return def;
}
}
关于java - 尝试返回 null 时出现 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41695774/