来自布尔的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