来自布尔的NullPointerException

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

这也适用于:

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

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


我的建议? 不返回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对象。

查看NilsH的出色答案,了解您的原始方法抛出异常的原因。


有趣但没有答案告诉你为什么这首先发生。

这与三元表达有关。

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

链接地址: http://www.djcxy.com/p/13263.html

上一篇: NullPointerException from Boolean

下一篇: Do you (really) write exception safe code?