De la documentation java de Map
Renvoie la valeur à laquelle la clé spécifiée est mappée, ou null si cette carte ne contient aucun mappage pour la clé.
Mais le code suivant lance Null Pointer exception .
public class Main {
public static void main(String args[]) throws Exception {
boolean bool = false;
Map<String, Boolean> map = new HashMap<>();
boolean r = bool ? false : map.get("a");
}
}
Quelqu'un peut-il m'aider à comprendre ce comportement. p >
3 Réponses :
Le get renvoie null , car la carte est vide. NullPointerException se produit lors de la tentative de conversion ("unbox") null en un booléen primitif pour donner à l'expression ternaire un type booléen primitif, aligné sur le false . P >
Le devoir n'est même jamais tenté, donc ce n'est pas pertinent.
C'est en fait booléen mais c'est ok.
En fait, la question vient d'être éditée
Le problème ici n'est pas avec le hashmap, mais plutôt le déballage automatique du résultat vers un booléen primitif.
Utilisez:
Map<String, Boolean> map = new HashMap<>();
boolean r = map.getOrDefault("a", false);
Notez que r est un objet wrapper Boolean "big b", pas un boolean primitif .
Comme MadaManu code > souligne, sachez que r peut être null , ce qui peut être assez surprenant pour les lecteurs de votre code. Vous pouvez à la place utiliser:
Map<String, Boolean> map = new HashMap<>();
Boolean r = map.get("a");
... si vous souhaitez traiter la clé manquante comme étant false .
Je ferais attention de le recommander car cela pourrait potentiellement jeter un NPE plus tard dans le code et cela ne fait que repousser le problème sans expliquer la cause première.
MadaManu: bien OP est conscient que la carte renvoie null dans le cas de la clé non mappée.
Certaines implémentations de carte peuvent stocker des valeurs null .
Depuis JLS 5.1 .8. Conversion de déballage
Si r est nul, la conversion de déballage lève une NullPointerException
Dans votre cas, map.get ("a") retourne null, puis Unboxing lève cette exception.
Vous pouvez utiliser Boolean pour contourner le problème: p>
Boolean r = map.get("a");
// here r will be null.
Qu'est ce que tu n'as pas compris? Relisez, ..ou null si cette carte ne contient aucun mappage pour la clé.
stackoverflow .com / questions / 34895627 /… , le sien pourrait être utile.