Java 来自布尔值的NullPointerException
我认为这是为java纯粹主义者准备的。我最近遇到了一个问题,就是如何将字符串值自定义解析为布尔值。这是一个非常简单的任务,但由于某种原因,下面的方法在null情况下抛出了一个NullPointerExceptionJava 来自布尔值的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
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.");
}
采用上述方法将有助于避免意外引用nullBoolean
对象
请参阅,以了解原始方法引发异常的原因。这同样有效:
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,以及解决方案!