Тернарный оператор и оператор if для возврата значения null int
В Java тернарный оператор (?:) позволяет присваивать null к переменной типа int, хотя int — это примитивный тип данных, который не поддерживает значения NULL. Рассмотрим следующий фрагмент кода:
int temp() {
return true ? null : 0;
}
В этом коде тернарный оператор присваивает переменной temp значение null, если оцениваемым условием является true, в противном случае он присваивает 0. Компилятор допускает это присвоение без каких-либо ошибок. Однако когда метод выполняется, во время выполнения он выдает исключение NullPointerException, поскольку значение null не является допустимым значением для int.
В отличие от тернарного оператора, оператор if не допускает таких нулевых присвоений переменным типа примитивные типы. Например:
int same() {
if (true) {
return null;
} else {
return 0;
}
}
Этот код генерирует ошибку времени компиляции с сообщением «несовместимые типы: значение null не может быть преобразовано в int». Причина этого несоответствия заключается в том, как компилятор обрабатывает значение null.
В случае тернарного оператора компилятор интерпретирует нулевой литерал как нулевую ссылку на Integer, класс-оболочку для int. Это связано с правилами компилятора для автоупаковки и распаковки: при преобразовании примитивного типа в объектный тип виртуальная машина Java (JVM) автоматически оборачивает примитивное значение в соответствующую оболочку объекта.
Поскольку int является примитивного типа, компилятор попытается распаковать нулевое значение, возвращенное тернарным оператором, что приведет к исключению NullPointerException.
С другой стороны, оператор if не выполняет этот процесс распаковки, и нулевой литерал остается как пустая ссылка на Object. Поскольку тип возвращаемого значения метода Same() — int, компилятор не может преобразовать нулевую ссылку в int, отсюда и ошибка времени компиляции.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3