NullPointerException没有真正的原因

时间:2012-09-29 17:26:40

标签: java nullpointerexception

    Character c = null;
    if (c != 'P') c = 'G';

这是一个简单的代码,用结果杀了我。而不是条件,我得到一个错误NullPointerException。虽然无效! ='P'并且必须满足条件。我很难解决额外的验证问题c!在条件“if”中为null。它应该是吗?有没有办法进行比较而不是错误?事实证明,所有代码都充满了这些不必要的检查。

4 个答案:

答案 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。您需要 cCharacter类型而不是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')永远不能为空。