Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Paradigmes informatiques

Gérer l'imbrications d'expressions ternaires en java

30/07/2019

Si à un moment donné vous avez besoin d'écrire en une seule ligne plusieurs conditions, les expressions ternaires sont pratiques, en écrivant comme ceci : variable = (condition ? valeurSiVrai : valeurSiFaux). Elles existent d'ailleurs dans de multiples langages (Java, Javascript, PHP, .Net...)

Dans certains cas, vous pouvez être tenté de cumuler les expressions ternaires, comme dans l'exemple ci-dessous où l'on souhaite transformer une chaîne pouvant avoir les valeurs Vrai/Faux/Null en objet Boolean true/false/null

String sChaine="vrai";
// Conversion de la chaîne en booléen avec gestion du null
Boolean bStatut=("vrai".equals(sChaine) ? true : ("faux".equals(sChaine) ? false : null));

Cependant, il y a une particularité en Java : ce code fonctionnera correctement si la chaîne est égale à "vrai" ou à "faux" mais pas avec null ou toute autre valeur et l'on obtiendra l'erreur NullPointerException.

Explication

Le type des expressions ternaires est déterminé par le compilateur. Lors de l'étape de compilation, seulement les éléments de la 1ère condition sont évalués : soit "true" et la 2ème condition. Cette 2ème condition n'est pas évaluée et est associée au même type que la 1ère. Le compilateur estime donc qu'il y a un seul type de variable possible, booléen, et attribue alors le type de la variable renvoyée comme étant de type booléen.

Le type primitif boolean ne gérant pas la valeur null, l'exécution plante donc quand on arrive sur ce cas.

A noter que si 2 types de variables différents sont trouvés, le compilateur utilise la base commune la plus proche entre eux.

Solution

Il faut donc préciser au compilateur de forcer à un type gérant le null, soit le type Boolean. En remplaçant "true" (dans la première condition) par Boolean.TRUE, le code fonctionne parfaitement. Par sécurité, il vaut mieux également le faire dans la 2ème condition, au cas où le compilateur évoluerait et intégrerait l'analyse des expressions imbriquées. Voilà ce que ça donne :

Boolean bStatut=("vrai".equals(sChaine) ? Boolean.TRUE : ("faux".equals(sChaine) ? Boolean.FALSE : null));

De la même façon, s'il faut renvoyer un entier dans certains cas et un NULL dans d'autres cas, il faudra écrire cela afin que l'interpréteur anticipe un type Integer et non un type int :

("1".equals(sChaine) ? (Integer)1 : (Integer)null)
Dernière modification le 30/07/2019 - Quillevere.net

Commentaires

Aucune inscription n'est requise si vous souhaitez

Rechercher sur le site

fr en rss RSS info Informations