我有两个Hashmaps
HashMap<Integer, Integer> inventoryRequirements = new HashMap<Integer, Integer>();
HashMap<Integer, Integer> inventory = new HashMap<Integer, Integer>();
我有一个循环检查当前并添加到它:
for(Item item : items){
int currentRequirement = 0;
currentRequirement = inventoryRequirements.get(item.get_id());
inventoryRequirements.put(item.get_id(), currentRequirement++);
}
我有另一个循环检查库存并添加到它:
for(Item item : items){
int currentInventory = 0;
// this next line returns null
currentInventory = inventory.get(item.get_id());
inventory.put(item.get_id(), currentInventory++);
}
第一个工作正常,但第二个工作并返回null。我不明白为什么第二个不起作用。两者最初都处于代码示例中描述的相同状态。
修改
如你所见,两个HM填充 - 真的!我知道这可能很难相信,但第一个有效,第二个没有。
答案 0 :(得分:12)
如果您通过NullPointerException
请求的密钥不在get()
中,则您展示的两个循环都会抛出Map
(NPE)。
Map.get()
会返回null
(当然,如果使用该密钥存储的值为null
),则返回Integer
。 null
的{{1}}(自动装帧类型)无法自动装入int
,因此会抛出NPE。
执行此操作的安全方法是:
for (Item item : items) {
Integer currentRequirement = inventoryRequirements.get(item.get_id());
if (currentRequirement != null) {
inventoryRequirements.put(item.get_id(), currentRequirement++);
}
}
当然,您的收藏集中Item
null
和 也是完全有可能正在抛出NPE。
答案 1 :(得分:1)
如果您提供的代码已完成,则表示您未在hashmap
中添加任何内容。
因此它将始终返回null
。
答案 2 :(得分:0)
您从inventory
获取了一个项目,但它是空的
答案 3 :(得分:0)
最佳做法是按以下方式编写代码:
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);
}