Character c = null;
if (c != 'P') c = 'G';
这是一个简单的代码,结果让我很生气。而不是条件,我得到一个错误 NullPointerException。虽然为空!= 'P' 并且必须满足条件。我为额外验证 c 的问题而苦苦挣扎!=在条件“如果”中为空。应该是吗?有什么方法可以进行比较而不是错误?所以事实证明,所有的代码都充满了这些不必要的检查。
Character c = null;
if (c != 'P') c = 'G';
这是一个简单的代码,结果让我很生气。而不是条件,我得到一个错误 NullPointerException。虽然为空!= 'P' 并且必须满足条件。我为额外验证 c 的问题而苦苦挣扎!=在条件“如果”中为空。应该是吗?有什么方法可以进行比较而不是错误?所以事实证明,所有的代码都充满了这些不必要的检查。
为了稍微扩展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')
您正在使用自动装箱,为 null 的包装类型 Character 被隐式转换为原始字符。这就是 NPE 发生的时候。
您正在尝试与原语进行比较和反对。Java 只能比较兼容类型的两个元素,因此它不会创建Character
with的实例'P'
,但会尝试将您的变量c
转换为 achar
并且不能这样做,因为它是null
。
另一种解决方案是使用“ Yoda Conditional ”语法:
Character c = null;
if (!new Character('P').equals(c)) c = new Character('G');
这意味着 NullPointerException 永远不会被抛出,因为null.equals()
它是无效的,而new Character('P')
永远不会是 null。