NullPointerException from Boolean

2022-09-03 01:28:31

我认为这是Java纯粹主义者的一个。我最近遇到了一个问题,该方法可以执行字符串值到布尔值的自定义解析。一个足够简单的任务,但由于某种原因,下面的方法是在空情况下抛出一个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;
}

答案 1

这也有效:

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

因此,您获得 NPE 的原因是由于自动装箱,因为在三元运算符中使用会导致表达式的结果被视为 .和解装盒的原因NPE。booleanbooleannull


答案 2

我的建议?不要返回 ,返回并引发异常:Booleanboolean

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的出色答案,了解为什么您的原始方法会引发异常。