Почему в Java char X = 89 работает, но не char X = 'X' + 1, хотя RHS является целым числом в обоих случаях [duplicate]

Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.

Пример:

string value = null;
if (value.Length == 0) // <-- Causes exception
{
    Console.WriteLine(value); // <-- Never reached
}

Ошибка исключения:

Необработанное исключение:

System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в Program.Main ()

17
задан Ben 9 September 2010 в 22:13
поделиться

4 ответа

'a' + 10 является выражением константы времени компиляции со значением 'k', которое может инициализировать переменную типа char. Это то же самое, что и возможность присваивать переменной byte целым числом в [-128, 127]. A byte в диапазоне [128, 255] может быть более раздражающим.

9
ответ дан Tom Hawtin - tackline 3 September 2018 в 15:37
поделиться

Константа имеет другой тип (я знаю, что спецификация говорит, что 10 должен быть int, но компилятор не видит этого таким образом).

В char c = 'a' + 10, 10 фактически считается постоянной переменной типа char (поэтому ее можно добавить в a). Поэтому char c = char + char работает.

В int i = 10; char c = 'a' + i; Вы добавляете символ в целое число (целое число может быть намного больше, чем char, поэтому он выбирает больший тип данных [int], чтобы результат aka: 'a' + i = int + int). Таким образом, результатом добавления является целое число, которое не может вписаться в char c.

Если вы явно наложили i на символ (например: char c = 'a' + (char)i;), он может работать, или если вы сделал обратное (например: int c = (int)'a' + i;), это сработает.

1
ответ дан Bob Fincheimer 3 September 2018 в 15:37
поделиться

Это потому, что компилятор может проверить, что он ('a' + 10) находится в пределах символа, тогда как он не может (в общем) проверить, что 'a' + <an integer> находится в пределах.

14
ответ дан einarmagnus 3 September 2018 в 15:37
поделиться

char на самом деле представляет собой неподписанное 16-разрядное целое число с диапазоном 0-65535. Таким образом, вы можете назначить любой целочисленный литерал в этом диапазоне для символа, например, «char c = 96», в результате чего «c» удерживает символ «a». Вы можете распечатать результат с помощью System.out.println (c).

Для константного выражения в правой части «char c = 'a' + 10», «a» продвигается к int сначала из-за правил рассылки числовой рекламы Java и целочисленного значения 96. После добавления 10 к нему мы получаем буквальное целое число 106, которое может быть присвоено символу.

Правая часть «char c = 'a' + i» не является константным выражением, и для правила присваивания результата выражения требуется явное преобразование из int в char, т. е. «char c = (char) ('a' + i) ".

4
ответ дан Po Chen 3 September 2018 в 15:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: