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
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.
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.
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 :
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 :
RSS | Informations |