布尔值的NullPointerException

时间:2013-04-26 09:49:00

标签: java nullpointerexception boolean

这是我认为的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;
}

3 个答案:

答案 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。