Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自布尔值的NullPointerException_Java_Nullpointerexception_Boolean - Fatal编程技术网

Java 来自布尔值的NullPointerException

Java 来自布尔值的NullPointerException,java,nullpointerexception,boolean,Java,Nullpointerexception,Boolean,我认为这是为java纯粹主义者准备的。我最近遇到了一个问题,就是如何将字符串值自定义解析为布尔值。这是一个非常简单的任务,但由于某种原因,下面的方法在null情况下抛出了一个NullPointerException static Boolean parseBoolean(String s) { return ("1".equals(s) ? true : ("0".equals(s) ? false : null)); } 该方法的返回类型是布尔型的,那么为什么或如何抛出NullPoi

我认为这是为java纯粹主义者准备的。我最近遇到了一个问题,就是如何将字符串值自定义解析为布尔值。这是一个非常简单的任务,但由于某种原因,下面的方法在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)
{
    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;
}

我的建议?不返回
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.");
}
采用上述方法将有助于避免意外引用null
Boolean
对象

请参阅,以了解原始方法引发异常的原因。

这同样有效:

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

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

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

这与三元表达式有关


编译器将null解释为布尔值的null引用,应用布尔值的自动装箱/取消装箱规则(在null上)=>您在运行时会得到一个NullPointerException。

+1做得好。不是一个原创者在看代码时的想法。很好的答案@Nils-那个狡猾的小魔鬼!我没有想过使用
布尔值
常量。@NilsH在撰写本文时可能错过了你的这一部分。:)+我同意。与其以后再遇到NPE,不如快速失败。如果需要“三态”解决方案,布尔值也有它的用途。这是一个三态条件,所以我真的不应该为期望值抛出异常!另外,异常处理不是更昂贵吗?+1用于一个漂亮的“谜题”@NilsH感谢+1,以及解决方案!