布尔值的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。