为什么以下投掷NPE?
Character c = null;
if(c == ' ') {
System.out.println("Is space");
}
这是c.equals(' ')
的一些语法糖吗?
答案 0 :(得分:11)
不完全是。操作c == ' '
等同于c.charValue() == ' '
,因此在charValue()
上调用null
时,会抛出NullPointerException
。
这是一个"拆箱" c
上的操作,而不是"拳击" ' '
后跟equals()
测试。
答案 1 :(得分:4)
在处理等于运算符==
期间,binary numeric promotion发生。
如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)是数字类型,则对操作数执行二进制数字提升(第5.6.2节) )。
请注意,二进制数字促销执行值集转换(第5.113节),并可执行拆箱转换(第5.1.8节)。
- 如果
r
为null
,则取消装箱转化会引发NullPointerException
JVM将Character
和char
视为操作数。它们可以转换为数字类型,因此它会将Character
取消装箱。 Character
为null
,因此解释了NPE。
它可能被认为是“语法糖”,但只是因为它会自动为你执行拆箱。
答案 2 :(得分:0)
试试这个..
Character c = null;
if(c != null) {
if(c.equals(' ')) {
System.out.println("Is space");
}
} else{System.out.println("c is null !!!"); }