"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi l'opérateur ternaire autorise-t-il le retour nul pour int alors qu'une instruction if ne le fait pas ?

Pourquoi l'opérateur ternaire autorise-t-il le retour nul pour int alors qu'une instruction if ne le fait pas ?

Publié le 2024-11-13
Parcourir:348

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

Opérateur ternaire vs. if Déclaration pour le retour nul de int

En Java, l'opérateur ternaire (?:) permet l'affectation de null à une variable de type int, même si int est un type de données primitif qui ne prend pas en charge les valeurs nulles. Considérez l'extrait de code suivant :

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

Dans ce code, l'opérateur ternaire attribue null à la variable temp si true est la condition évaluée, sinon il attribue 0. Le compilateur autorise cette affectation sans émettre d'erreur. Cependant, lorsque la méthode est exécutée, elle lèvera une NullPointerException au moment de l'exécution car null n'est pas une valeur valide pour int.

Contrairement à l'opérateur ternaire, l'instruction if n'autorise pas de telles affectations nulles aux variables de types primitifs. Par exemple :

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

Ce code générera une erreur de compilation avec le message "types incompatibles : null ne peut pas être converti en int." La raison de cette différence réside dans la façon dont le compilateur traite la valeur null.

Dans le cas de l'opérateur ternaire, le compilateur interprète le littéral nul comme une référence nulle à un Integer, la classe wrapper pour int. Cela est dû aux règles du compilateur pour l'autoboxing et unboxing : lors de la conversion d'un type primitif en un type d'objet, la machine virtuelle Java (JVM) encapsule automatiquement la valeur primitive dans le wrapper d'objet correspondant.

Puisque int est un type primitif, le compilateur tentera de déballer la valeur nulle renvoyée par l'opérateur ternaire, ce qui entraîne l'exception NullPointerException.

D'un autre côté, l'instruction if n'effectue pas ce processus de déballage et le littéral nul reste comme référence nulle à Object. Puisque le type de retour de la méthode same() est int, le compilateur ne peut pas convertir la référence nulle en int, d'où l'erreur de compilation.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3