布尔值的NullPointerException

这是我认为的java纯粹主义者之一。 我最近遇到了一个问题,即一个方法来执行String值的自定义解析。 一个简单的任务,但由于某种原因,下面的方法是在null情况下抛出NullPointerException …

static Boolean parseBoolean(String s) { return ("1".equals(s) ? true : ("0".equals(s) ? false : null)); } 

该方法的返回类型是布尔值,那么为什么或如何抛出NullPointerException? 从调试开始,似乎exception是在嵌套的内联条件语句求值为null并将null返回到外部内联条件的点处抛出,但我再也无法解释原因。

最终我放弃并重写了如下方法,它按预期工作:

 static Boolean parseBoolean(String s) { if ("1".equals(s)) return true; if ("0".equals(s)) return false; return null; } 

以下代码介于两者之间,也可按预期工作:

 static Boolean parseBoolean(String s) { if ("1".equals(s)) return true; return "0".equals(s) ? false : null; } 

这也有效:

 static Boolean parseBoolean(String s) { return ("1".equals(s) ? Boolean.TRUE : ("0".equals(s) ? Boolean.FALSE : null)); } 

因此,获得NPE的原因是由于自动装箱,因为在三元运算符中使用boolean会导致表达式的结果被视为boolean 。 并且取消null会导致NPE。

我的建议? 不要返回Boolean ,返回boolean并抛出exception:

 static boolean parseBoolean(String s) { if ("1".equals(s)) return true; if ("0".equals(s)) return false; throw new IllegalArgumentException(s + " is not a boolean value."); } 

采用上述方法将有助于避免您意外引用null Boolean对象。

请参阅NilsH的优秀答案,了解原始方法为什么会抛出exception。

有趣但没有答案告诉你为什么会发生这种情况。

这与三元表达有关。

编译器将null解释为对Boolean的null引用,对Boolean应用自动装箱/取消装箱规则(在null上)=>在运行时获得NullPointerException。