从HashMap检索时出现空指针异常,即使containsKey()返回true

时间:2014-01-02 17:21:36

标签: java android nullpointerexception hashmap

我一直在开发Android吉他应用程序,目前我遇到了HashMap的一些问题。

总结一下,当我尝试使用HashMapget(key)检索值时,我得到 nullpointer异常,尽管containsKey(key)返回{{1}对于那个密钥。

具体来说,我有一个类true的实例,其_currentPreset名为HashMap,在类中初始化如下:

_maxCoordRange

在类的构造函数中不修改此参数。相反,它只能通过以下方法修改:

private Map<String, Float> _maxCoordRange = new HashMap<String, Float>();

并通过以下方式访问:

public void setMaxCoordRange(String parName, float value) {
    _maxCoordRange.put(parName, value);
}

我创建public float getMaxCoordRange(String parName) { return _maxCoordRange.get(parName); } 实例后,我将_currentPreset地图设置为这样的值:

_maxCoordRange

在代码的其他部分,我执行以下操作:

for (int i = 0; i < _currentPreset.getCoordiates().size(); i++) {       
    _currentPreset.setMaxCoordRange(_currentPreset.getParNames().get(i), 0.75f);
}

这是奇怪的部分。当我尝试使用if(_currentPreset.getMaxCoordRange().containsKey(pareterName)){ cord.setMaxValueCoord(_currentPreset.getMaxCoordRange(pareterName)); } pareterName检索HashMap对应的值时,我得到一个nullpointer exeption,尽管getMaxCoordRange返回true。

我做了一些调试,我发现了一些比较奇怪的东西。 当我把值放在map中时,在expressions标签中(当在eclipse中处于调试模式时),表格如下所示:

containsKey(key)

应该有10个值,但是有2个,但是其中2个在元素14和15的table HashMap$HashMapEntry[16] (id=829660787832) [0] null [1] null [2] null [3] null [4] null [5] null [6] null [7] null [8] HashMap$HashMapEntry (id=829660788568) [9] HashMap$HashMapEntry (id=829660786456) [10] HashMap$HashMapEntry (id=829660787920) [11] HashMap$HashMapEntry (id=829660788376) [12] HashMap$HashMapEntry (id=829660787448) [13] HashMap$HashMapEntry (id=829660787640) [14] HashMap$HashMapEntry (id=829660786840) hash 789729998 key "Test Par3" (id=829660737240) next HashMap$HashMapEntry (id=829660786144) hash 789729854 key "Test Par1" (id=829660736816) next null value Float (id=829660786088) value Float (id=829660786824) [15] HashMap$HashMapEntry (id=829660787088) hash 789729999 key "Test Par4" (id=829660737376) next HashMap$HashMapEntry (id=829660786648) hash 789729855 key "Test Par2" (id=829660737104) next null value Float (id=829660786632) value Float (id=829660787016) 字段中。我读到这是hashMaps排列数据的方式,以便更有效,但这不是我无法检索值的原因吗?

很抱歉提供了这么多信息,但我真的不知道问题出在哪里。我之前使用过HashMaps而且没有这个问题。

关于如何解决这个问题并最终从地图中获取我的价值的任何想法?

1 个答案:

答案 0 :(得分:0)

你可能正在使用带有索引和字符串的“get()”。

在这里,您假设索引与您的表线性匹配。正如您的调试所示,他们没有。您已将其设置为通过字符串访问,但您正在使用索引。

for (int i = 0; i < _currentPreset.getCoordiates().size(); i++) {       
_currentPreset.setMaxCoordRange(_currentPreset.getParNames().get(i), 0.75f);
}

在这里,您正在使用pareterName,无论是什么。我希望它是一个字符串

if(_currentPreset.getMaxCoordRange().containsKey(pareterName)){
            cord.setMaxValueCoord(_currentPreset.getMaxCoordRange(pareterName));
        }

要使HashMaps有效,请坚持通过String定义访问数据,因为您已将其定义为: