Сравнение нулевого символа с исключением бросков персонажа - PullRequest
0 голосов
/ 08 мая 2018

Почему следующий бросает NPE?

Character c = null;
if(c == ' ') {   
  System.out.println("Is space");  
}  

Это какой-то синтаксический сахар для c.equals(' ')?

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

При обработке оператора равенства ==, происходит двоичное числовое продвижение .

Если оба операнда оператора равенства имеют числовой тип или один имеет числовой тип, а другой преобразуется (§5.1.8) в числовой тип, двоичные числовые преобразования выполняются над операндами (§5.6.2) ).

Обратите внимание, что двоичное числовое продвижение выполняет преобразование набора значений (§5.1.13) и может выполнять преобразование без распаковки (§5.1.8) .

Распаковка конвертации :

  • Если r равно null, преобразование при распаковке выдает NullPointerException

JVM видит Character и char в качестве операндов. Они могут быть преобразованы в числовые типы, поэтому он распаковывает Character. Character - это null, что объясняет NPE.

Это может считаться "синтаксическим сахаром", но только потому, что он автоматически выполняет распаковку для вас.

0 голосов
/ 09 мая 2018

попробуйте это ..

Character c = null;
if(c != null) {   
  if(c.equals(' ')) {   
  System.out.println("Is space");  
}    
} else{System.out.println("c is null !!!");  } 
0 голосов
/ 08 мая 2018

Не совсем так. Операция c == ' ' эквивалентна c.charValue() == ' ', поэтому, когда charValue() вызывается для null, выдается NullPointerException.

Это операция «распаковки» на c, а не «упаковка» ' ' с последующим equals() тестом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...