web-dev-qa-db-fra.com

Hashmap get renvoie null

J'ai deux cartes de hachage

HashMap<Integer, Integer> inventoryRequirements = new HashMap<Integer, Integer>();
HashMap<Integer, Integer> inventory = new HashMap<Integer, Integer>();

J'ai une boucle qui vérifie le courant et y ajoute:

for(Item item : items){
    int currentRequirement = 0;
    currentRequirement = inventoryRequirements.get(item.get_id());
    inventoryRequirements.put(item.get_id(), currentRequirement++);         
}

J'ai une autre boucle qui vérifie l'inventaire et y ajoute:

for(Item item : items){
    int currentInventory = 0;
    // this next line returns null
    currentInventory = inventory.get(item.get_id());
    inventory.put(item.get_id(), currentInventory++);           
}

Le premier fonctionne bien, mais le second vomit et renvoie un null. Je ne comprends pas pourquoi le second ne fonctionne pas. Les deux sont initialement dans le même état que celui décrit dans l'exemple de code.

MODIFIER

Les deux HM sont peuplés comme vous voyez ici - vraiment! Je sais que cela peut être difficile à croire mais le premier fonctionne et le second ne fonctionne pas.

8
Roy Hinkley

Les deux boucles que vous affichez lanceront une NullPointerException (NPE) si la clé que vous demandez via get() ne se trouve pas dans la Map.

Map.get() renvoie null lorsque la clé n'est pas présente (ou bien sûr si la valeur stockée avec cette clé est null). Une Integer (type à substitution automatique) qui est null ne peut pas être automatiquement placée dans une int, elle renvoie donc un NPE. 

Le moyen le plus sûr d’exécuter ceci est:

for (Item item : items) {
    Integer currentRequirement = inventoryRequirements.get(item.get_id());
    if (currentRequirement != null) {
        inventoryRequirements.put(item.get_id(), currentRequirement++);         
    }
}

Bien sûr, il est également tout à fait possible que vous ayez une Item dans votre collection qui est null et qui est ce qui lance le NPE. 

12
Brian Roach

Si le code que vous avez fourni est complet, vous n'avez rien mis dans votre hashmap. Ainsi, il retournera toujours null.

1
Prasad Kharkar

La meilleure pratique consiste à écrire le code de la manière suivante: 

for(Item item : items){
int currentRequirement = 0;
currentRequirement = inventoryRequirements.get(item.get_id());
if(currentRequirement!=null){
//update currentRequirement only if it exists in the map.
   inventoryRequirements.put(item.get_id(), currentRequirement++); 
} else {
   //add it to the map otherwise.
   inventoryRequirements.put(item.get_id(), 1);       
}
0
user7489380

Vous obtenez un élément de inventory mais il est vide

0
lleon