尝试返回null时的NPE

Fel*_*lix 10 java nullpointerexception

当使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 14

这非常微妙.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

......,当然,叫floatValuenull抛出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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Float.valueOf(STR) (2认同)
  • 为清楚起见,我的建议是摆脱`?`运算符并使用简单的`if`.是的,你还有一些代码.但它也更容易理解正在发生的事情,而解析并立即回到资本浮动会让我想到"那时我做的是什么......"几个月之后...... :) - 那么`valueOf`当然是最简单的方法......呃! (2认同)