这是我认为的java纯粹主义者的一个。我最近遇到一个问题,一个方法来执行自定义的String值解析为布尔值。一个简单的任务,但由于某种原因,下面的方法是在null的情况下抛出NullPointerException ...
static Boolean parseBoolean(String s)
{
return ("1".equals(s) ? true : ("0".equals(s) ? false : null));
}
该方法的返回类型是布尔值,那么为什么或如何抛出NullPointerException? 从调试开始,似乎异常是在嵌套的内联条件语句求值为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;
}
答案 0 :(得分:13)
这也有效:
static Boolean parseBoolean(String s)
{
return ("1".equals(s) ? Boolean.TRUE : ("0".equals(s) ? Boolean.FALSE : null));
}
因此,获得NPE的原因是由于自动装箱,因为在三元运算符中使用boolean
会导致表达式的结果被视为boolean
。而null
的解除拳击会导致NPE。
答案 1 :(得分:8)
我的建议?不要返回Boolean
,返回boolean
并抛出异常:
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.");
}
采用上述方法有助于避免意外引用空Boolean
对象。
请参阅excellent answer from NilsH,了解原始方法引发异常的原因。
答案 2 :(得分:2)
有趣但没有回答告诉你为什么这首先发生。
这与三元表达有关。
编译器将null解释为对Boolean的空引用,对Boolean应用自动装箱/取消装箱规则(在null上)=>你在运行时得到一个NullPointerException。