Character c = null;
if (c != 'P') c = 'G';
这是一个简单的代码,用结果杀了我。而不是条件,我得到一个错误NullPointerException。虽然无效! ='P'并且必须满足条件。我很难解决额外的验证问题c!在条件“if”中为null。它应该是吗?有没有办法进行比较而不是错误?事实证明,所有代码都充满了这些不必要的检查。
答案 0 :(得分:8)
要稍微扩展一下nansen的答案,您的代码相当于:
Character c = null;
char tmp = c.charValue();
if (tmp != 'P')
{
c = Character.valueOf('G');
}
这是根据section 15.21.1 of the JLS(==
和!=
):
如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)是数字类型,则对操作数执行二进制数字提升(第5.6.2节) )。
请注意,二进制数字促销执行值集转换(第5.1.13节)并可执行拆箱转换(第5.1.8节)。
希望现在你会明白为什么你会得到NullPointerException
。您需要 c
是Character
类型而不是char
吗?如果你真的这样做,你应该使用:
if (c == null || c != 'P')
答案 1 :(得分:7)
您正在使用自动装箱,包装类型字符null将隐式转换为原始字符。那是NPE正在发生的时候。
答案 2 :(得分:1)
您正在尝试与基元进行比较和对象。 Java只能比较兼容类型的两个元素,因此它不会使用Character
创建'P'
的实例,但会尝试将变量c
转换为char
并且不能这样做,因为它是null
。
答案 3 :(得分:0)
另一种解决方案是使用“Yoda Conditional”语法:
Character c = null;
if (!new Character('P').equals(c)) c = new Character('G');
这意味着永远不会抛出NullPointerException,因为null.equals()
无效,而new Character('P')
永远不能为空。