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.
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.
Si le code que vous avez fourni est complet, vous n'avez rien mis dans votre hashmap
. Ainsi, il retournera toujours null
.
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);
}
Vous obtenez un élément de inventory
mais il est vide