«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему тернарный оператор допускает возврат значения NULL для int, а оператор if — нет?

Почему тернарный оператор допускает возврат значения NULL для int, а оператор if — нет?

Опубликовано 13 ноября 2024 г.
Просматривать:791

Why Does the Ternary Operator Allow Null Return for int While an if Statement Doesn't?

Тернарный оператор и оператор 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