"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué el operador ternario permite un retorno nulo para int mientras que una declaración if no?

¿Por qué el operador ternario permite un retorno nulo para int mientras que una declaración if no?

Publicado el 2024-11-13
Navegar:165

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

Operador ternario frente a declaración if para devolución nula de int

En Java, el operador ternario (?:) permite la asignación de null a una variable de tipo int, aunque int es un tipo de datos primitivo que no admite valores nulos. Considere el siguiente fragmento de código:

int temp() {
    return true ? null : 0;
}

En este código, el operador ternario asigna nulo a la variable temp si la condición evaluada es verdadera; de lo contrario, asigna 0. El compilador permite esta asignación sin emitir ningún error. Sin embargo, cuando se ejecuta el método, generará una excepción NullPointerException en tiempo de ejecución porque nulo no es un valor válido para int.

A diferencia del operador ternario, la instrucción if no permite asignaciones nulas a variables de tipos primitivos. Por ejemplo:

int same() {
    if (true) {
        return null;
    } else {
        return 0;
    }
}

Este código generará un error en tiempo de compilación con el mensaje "tipos incompatibles: nulo no se puede convertir a int". La razón de esta discrepancia radica en la forma en que el compilador trata el valor nulo.

En el caso del operador ternario, el compilador interpreta el literal nulo como una referencia nula a un número entero, la clase contenedora de int. Esto se debe a las reglas del compilador para autoboxing y unboxing: al convertir de un tipo primitivo a un tipo de objeto, la Máquina Virtual Java (JVM) envuelve automáticamente el valor primitivo en el contenedor de objeto correspondiente.

Dado que int es un tipo primitivo, el compilador intentará desempaquetar el valor nulo devuelto por el operador ternario, lo que resulta en NullPointerException.

Por otro lado, la declaración if no realiza esto proceso de unboxing, y el literal nulo permanece como una referencia nula al Objeto. Dado que el tipo de retorno del mismo método() es int, el compilador no puede convertir la referencia nula a int, de ahí el error en tiempo de compilación.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3