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

这是一个简单的代码,结果让我很生气。而不是条件,我得到一个错误 NullPointerException。虽然为空!= 'P' 并且必须满足条件。我为额外验证 c 的问题而苦苦挣扎!=在条件“如果”中为空。应该是吗?有什么方法可以进行比较而不是错误?所以事实证明,所有的代码都充满了这些不必要的检查。

4

4 回答 4

8

为了稍微扩展nansen的答案,您的代码相当于:

Character c = null;

char tmp = c.charValue();
if (tmp != 'P')
{
    c = Character.valueOf('G');
}

这是根据JLS (和)的第 15.21.1 节==!=

如果相等运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第 5.1.8 节)为数字类型,则对操作数执行二进制数字提升(第 5.6.2 节)。

请注意,二进制数字提升执行值集转换(第 5.1.13 节)并可能执行拆箱转换(第 5.1.8 节)。

希望现在你会明白为什么你会得到一个NullPointerException. 你需要 c是 typeCharacter而不是char?如果你真的这样做,你应该使用:

if (c == null || c != 'P')
于 2012-09-29T17:30:03.530 回答
7

您正在使用自动装箱,为 null 的包装类型 Character 被隐式​​转换为原始字符。这就是 NPE 发生的时候。

于 2012-09-29T17:28:52.567 回答
1

您正在尝试与原语进行比较和反对。Java 只能比较兼容类型的两个元素,因此它不会创建Characterwith的实例'P',但会尝试将您的变量c转换为 achar并且不能这样做,因为它是null

于 2012-09-29T17:29:31.200 回答
0

另一种解决方案是使用“ Yoda Conditional ”语法:

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

这意味着 NullPointerException 永远不会被抛出,因为null.equals()它是无效的,而new Character('P')永远不会是 null。

于 2012-09-29T18:24:52.103 回答