Java Hashmap get返回null

Java Hashmap get返回null,java,hashmap,Java,Hashmap,我有两个哈希图 HashMap<Integer, Integer> inventoryRequirements = new HashMap<Integer, Integer>(); HashMap<Integer, Integer> inventory = new HashMap<Integer, Integer>(); 我有另一个循环检查库存并添加到其中: for(Item item : items){ int currentRequi

我有两个哈希图

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++);           
}
第一个可以正常工作,但第二个会呕吐并返回空值。我不明白为什么第二个不起作用。两者最初处于代码示例中描述的相同状态

编辑


正如你在这里看到的,这两个HM被填充了——真的!我知道这可能很难相信,但第一个有效,第二个无效。

如果您提供的代码是完整的,那么您没有在
哈希映射中放入任何内容。

因此,如果您通过
get()
请求的键不在
映射中,它将始终返回
null

但它是空的
如果您通过
get()
请求的键不在
映射中,则您显示的两个循环都将抛出
NullPointerException
(NPE)

Map.get()。
整型
(自动装箱类型)为
null
整型
(自动装箱类型)无法自动解装箱为
int
,因此它会抛出一个NPE

执行此操作的安全方法是:

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

当然,也完全有可能您的集合中有一个
,它是
null
,这就是引发NPE的原因

最佳实践是以以下方式编写代码:

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);       
}

您是否曾经
任何东西放入
库存
?另外,为什么不使用
Map
s呢?如果
inventoryRequirements
开始时为空,第一个循环也会失败。它永远不会到达该行来放入任何内容。至于为什么不改为Map呢?我没有很好的答案,这有真正的优势吗?在一个空的
HashMap
上调用
get(int)
将返回
null
@AndroidAddict,因为在第一个和第二个代码段之间显然有其他代码没有显示给我们。真的!!但在这种情况下,我想知道为什么第一段代码运行良好???这是不正确的。如果是这样的话,
foreach
循环本身将无法在
HashMap
上迭代。为什么??Foreach循环正在列表上迭代。。我不明白它为什么会失败。@PVR他的意思是foreach中的代码会失败,因为Brian在他的回答中说了什么。+1是最后一点,但他确实说它返回null而不是抛出null,但这也没有意义,因为它是一个
int
。如果
get()
返回
null
它抛出。或者,他的JVM/计算机坏了;)我倾向于一个
null
,我自己。