Почему следующий бросает NPE?
Character c = null; if(c == ' ') { System.out.println("Is space"); }
Это какой-то синтаксический сахар для c.equals(' ')?
c.equals(' ')
При обработке оператора равенства ==, происходит двоичное числовое продвижение .
==
Если оба операнда оператора равенства имеют числовой тип или один имеет числовой тип, а другой преобразуется (§5.1.8) в числовой тип, двоичные числовые преобразования выполняются над операндами (§5.6.2) ). Обратите внимание, что двоичное числовое продвижение выполняет преобразование набора значений (§5.1.13) и может выполнять преобразование без распаковки (§5.1.8) .
Если оба операнда оператора равенства имеют числовой тип или один имеет числовой тип, а другой преобразуется (§5.1.8) в числовой тип, двоичные числовые преобразования выполняются над операндами (§5.6.2) ).
Обратите внимание, что двоичное числовое продвижение выполняет преобразование набора значений (§5.1.13) и может выполнять преобразование без распаковки (§5.1.8) .
Распаковка конвертации :
Если r равно null, преобразование при распаковке выдает NullPointerException
r
null
NullPointerException
JVM видит Character и char в качестве операндов. Они могут быть преобразованы в числовые типы, поэтому он распаковывает Character. Character - это null, что объясняет NPE.
Character
char
Это может считаться "синтаксическим сахаром", но только потому, что он автоматически выполняет распаковку для вас.
попробуйте это ..
Character c = null; if(c != null) { if(c.equals(' ')) { System.out.println("Is space"); } } else{System.out.println("c is null !!!"); }
Не совсем так. Операция c == ' ' эквивалентна c.charValue() == ' ', поэтому, когда charValue() вызывается для null, выдается NullPointerException.
c == ' '
c.charValue() == ' '
charValue()
Это операция «распаковки» на c, а не «упаковка» ' ' с последующим equals() тестом.
c
' '
equals()