【问题标题】:Can a get() ever be null after a containsKey() check in a Hashtable? [closed]Hashtable 中的 containsKey() 检查后,get() 是否可以为空? [关闭]
【发布时间】:2019-01-12 17:17:04
【问题描述】:

我在一个 android 应用程序中实现了一个 Hashtable,它最初以以下方式填充:

if(table.containsKey(key)){
    table.get(key).add(item);
}else{
    table.put(key, new ArrayList<Items>());
    table.get(key).add(item);
}

(变量名略有变化)

Android Studio 对两种添加方法都给出了Method invocation 'add' may produce NullPointerException 警告。我以前(也是唯一)对 dict 类型结构的经验来自 Python,这从来都不是问题,但为了安全起见,我想检查一下:这实际上是否有可能抛出 NPE?

干杯

【问题讨论】:

  • 从 Android API 26 开始有一种更简单的方法:table.computeIfAbsent(key, k -&gt; new ArrayList&lt;Items&gt;()).add(item)
  • @JoeC 这很酷,不幸的是我的 API 级别不支持它(最低为 19,需要 24)。谢谢,不过,不知道这个
  • 可能值得注意的是,甚至 Android 本身也不再支持 API 级别 19,因此您可能需要考虑一下为什么。
  • @JoeC 那是……一个很好的观点。不幸的是,这不取决于我,但我会问我的主管
  • 奇怪,你得到了'add'的错误,而不是get或put。你确定你使用的是HashTable

标签: java android-studio hashtable


【解决方案1】:

让我们看看Hashtable.get的文档:

返回指定键映射到的值,如果是null 此映射不包含键的映射。

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

所以如果Hashtable中的一个KVP的值为null,那么if分支中就会出现NPE。

如果key 为空,containsKeyput 也会抛出 NPE,因此在 else 分支中也可能发生 NPE。

【讨论】:

  • 还有疑问,为什么'add'会产生NullPointerException
【解决方案2】:

键可以存在于地图中,但值可以是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
}

要解决这个问题,您可以使用computeIfAbsent()

【讨论】:

  • table.put(key, null) docs.oracle.com/javase/8/docs/api/java/util/…)
猜你喜欢
  • 2014-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多