Java 在哈希表中进行containsKey()检查后,get()是否可以为null?

Java 在哈希表中进行containsKey()检查后,get()是否可以为null?,java,android-studio,hashtable,Java,Android Studio,Hashtable,我已经在android应用程序中实现了一个哈希表,该哈希表最初以以下方式填充: if(table.containsKey(key)){ table.get(key).add(item); }else{ table.put(key, new ArrayList<Items>()); table.get(key).add(item); } if(表.containsKey(键)){ 表.get(键).add(项); }否则{ table.put(key,newa

我已经在android应用程序中实现了一个哈希表,该哈希表最初以以下方式填充:

if(table.containsKey(key)){
    table.get(key).add(item);
}else{
    table.put(key, new ArrayList<Items>());
    table.get(key).add(item);
}
if(表.containsKey(键)){
表.get(键).add(项);
}否则{
table.put(key,newarraylist());
表.get(键).add(项);
}
(变量名称略有更改)

Android Studio提供了一个
方法调用'add'可能会在两个add方法上产生NullPointerException
警告。我以前(也是唯一一次)对dict类型结构的体验来自Python,这从来都不是问题,但为了安全起见,我想检查一下:这真的有可能抛出一个NPE吗


Cheers

键可以出现在地图中,但值可以是
null
,如下所示:

Map<String, String> hmap = new Hashtable<String, String>();
hmap.put("A", null);

if (hmap.containsKey("A")) {
    hmap.get("A").length(); // this can cause a NPE
}
Map hmap=newhashtable();
hmap.put(“A”,空);
如果(hmap.containsKey(“A”)){
hmap.get(“A”).length();//这可能会导致NPE
}

要解决此问题,您可以使用

让我们看看以下文档:

返回指定键映射到的值,如果 此映射不包含密钥的映射

更正式地说,如果此映射包含从键k到值的映射 v使得
(key.equals(k))
,然后该方法返回v;否则它 返回null。(最多可以有一个这样的映射。)

因此,如果哈希表中的一个KVP的值为null,则在if分支中将出现NPE


containsKey
put
如果
key
为null,也会抛出一个NPE,因此NPE也可能发生在else分支中。

从Android API 26开始有一个更简单的方法:
table.computeIfAbsent(key,k->new ArrayList()).add(item)
@JoeC这很酷,不幸的是,我的API级别不支持它(最小值为19,需要24)。不过,谢谢你不知道这一点值得注意的是,即使Android本身不再支持API 19级,所以你可能想考虑一下为什么。一个很好的观点。不幸的是,这不取决于我,但我会问我的主管Trange,您得到的是“add”错误,而不是get或put。您确定使用的是
哈希表吗?
表。put(key,null)
为什么“add”会产生NullPointerException仍然值得怀疑?