Mon opérateur ternaire lance une NullPointerException
même si je vérifie explicitement si la valeur de ma liste est null
. Cependant, si j'ajoute des parenthèses autour de l'opérateur ternaire, mon code fonctionne.
Code sans parenthèses (levant l'exception):
final List<String> listData = null; System.out.println("Insert new data (Created Monitorings) : " + (listData != null ? listData.size() : 0));
Code entre parenthèses (fonctionne bien):
final List<String> listData = null; System.out.println("Insert new data (Created Monitorings) : " + listData != null ? listData.size() : 0);
Quelqu'un peut-il expliquer comment cela fonctionne exactement?
3 Réponses :
dans l'extrait 1, la valeur comparée à null est "Insert new data (Created Monitorings):" + listData
Il s'agit de priorité des opérateurs: la chaîne + a une priorité beaucoup plus élevée que l'opérateur ternaire suivant.
Par conséquent, votre premier extrait de code fait en fait ceci:
( "Insert new data (Created Monitorings) : " + listData ) != null ? listData.size() : 0
Signification: vous concatez une chaîne ( avec un listData
nul), et comparez-le à null. Evidemment, cette chaîne concatée n'est pas nulle. Ainsi, vous appelez listData.size ()
. Et cela ressemble à null.size ()
qui mène à votre NullPointerException.
Vous comparez la mauvaise chose à null! Dans le deuxième extrait de code, les (parenthèses) garantissent que le résultat de l'opération ternaire est ajouté à votre chaîne.
'+' a plus de priorité que '! ='
Par conséquent, l'extrait de code 1 se traduit par:
( ("Insérer de nouvelles données (Moniteurs créés):" + listData) ! = null? listData.size (): 0;
L'expression n'est pas nulle donc elle passe à listData.size (). Mais comme il est nul, il lève l'exception.
NullPointerException n'est pas une erreur de compilation
@GhostCat Oui !!! Je vous remercie :)