Maison  >  Article  >  Java  >  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 ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-05 01:09:01271parcourir

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

Opérateur ternaire vs déclaration if 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 :

<code class="java">int temp() {
    return true ? null : 0;
}</code>

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 :

<code class="java">int same() {
    if (true) {
        return null;
    } else {
        return 0;
    }
}</code>

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 cet écart 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 le 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'autre part, 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.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn