【问题标题】:(Hash-)Map has entry, get delivers null(Hash-)Map 有入口,get 传递 null
【发布时间】:2013-07-15 09:26:35
【问题描述】:

我不知道这里发生了什么。我有一个具有以下大小为 4 的键集的 HashMap:

steps.keySet()
(java.util.HashMap$KeySet)
[INIT_FZLIST, INIT_DATA, INSTALL_DATABASE, PROMPT_GERAETEID]

INIT_FZLIST、INIT_DATA、INSTALL_DATABASE 和 PROMPT_GERAETEID 是枚举的值。

entrySet 也提供 4 个条目。

steps.entrySet()
(java.util.HashMap$EntrySet)
[INIT_FZLIST=de.ansat.terminal.activity.widgets.PendingCheckbox{b50cb4e0 V.E..... ......I. 24,524-456,666},
 INIT_DATA=de.ansat.terminal.activity.widgets.PendingCheckbox{b50c8748 V.E..... ......I. 24,350-456,524},
 INSTALL_DATABASE=de.ansat.terminal.activity.widgets.PendingCheckbox{b508e288 V.E..... ......I. 24,68-456,209},
 PROMPT_GERAETEID=de.ansat.terminal.activity.widgets.PendingCheckbox{b50c59b0 V.E..... ......I. 24,209-456,350}]

但如果我这样做:

steps.get(INSTALL_DATABASE)
 null

地图返回 null 并且如果我尝试使用结果对象,我会得到一个 nullpointerexception。

这是在 Android 活动中运行的。 我在 API 级别 17 上使用 Android 4.2.2

[编辑]

private Map<InstallSteps, PendingCheckbox> steps = new HashMap<InstallSteps, PendingCheckbox>();

是我的活动类的一个字段。

我有几个 AsyncTask 在该地图上工作,因为它代表了安装过程的进度。

PendingCheckbox 是一个扩展 LinearLayout 的 View。

[编辑2] 步骤是这样填写 onCreate(..) 的:

    PendingCheckbox installDb = new PendingCheckbox(InstallActivity.this);
    installDb.setText(INSTALL_DATABASE);
    installDb.setChecked(false);
    installDb.setLayoutParams(layoutParams);
    root.addView(installDb);
    steps.put(InstallSteps.INSTALL_DATABASE, installDb);

有谁知道可能导致这种行为的原因?我完全被卡住了。 任何提示将不胜感激!

【问题讨论】:

  • 什么是 INSTALL_DATABASE,枚举?细绳?变量?
  • 'INSTALL_DATABASE' 是什么类型的?
  • 抱歉:私有枚举 InstallSteps { INSTALL_DATABASE,PROMPT_GERAETEID,INIT_DATA,INIT_FZLIST,}
  • hashcode() / equals() 方法在同一对象上的两次调用之间不一致时,很可能会发生这种行为。您能否发布完整的 Enum 课程内容?
  • 不,我没有。我应该吗?

标签: java android map


【解决方案1】:

您可以使用EnumMap 代替HashMap

用于枚举类型键的专用 Map 实现。枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。

就您的代码而言,请记住:

  1. 地图中对象的hashCode 在添加到地图后不应更改。 equals()hashCode() 的良好实现是必需的。

  2. get(key) 确定其值之前,检查您是否真的 put(key,value) 具有该 key 的对象。

【讨论】:

  • 1) 我使用了 Eclipse 等于生成器。 PendingCheckbox 的字段是 Android Views 和另一个枚举值。所以应该是正确的。 2) 可以看到steps.entrySet() 显示键包含在地图中。
【解决方案2】:

可能在获取之前更改了步骤,或者稍后发生了放置,或者您有两个步骤声明。

【讨论】:

  • 方法 hashCode() 和 equals(...) 在 Enum> 中是最终的。他们只是不能被覆盖。它甚至没有意义,因为枚举的值是单例的。
  • @Seelenvirtuose 谢谢;删除预订w.r.t. hashCode(很难无意中制作出不起作用的 hashCode)。
猜你喜欢
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 2021-05-01
  • 2011-08-01
  • 1970-01-01
相关资源
最近更新 更多