17

这是我认为的 Java 纯粹主义者之一。我最近遇到了一个将字符串值自定义解析为布尔值的方法的问题。一个足够简单的任务,但由于某种原因,下面的方法在 null 情况下抛出 NullPointerException ......

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

该方法的返回类型是 Boolean 那么为什么或如何抛出 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;
}
4

3 回答 3

13

这也有效:

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

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

于 2013-04-26T09:55:21.617 回答
8

我的建议?不要 return Boolean, returnboolean并抛出异常:

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对象。

请参阅NilsH 的出色回答,了解为什么您的原始方法会引发异常。

于 2013-04-26T09:52:00.437 回答
2

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

这与三元表达式有关。

编译器将 null 解释为对 Boolean 的 null 引用,对 Boolean(在 null 上)应用自动装箱/拆箱规则 => 在运行时您会收到 NullPointerException。

于 2013-04-26T10:00:11.787 回答