我一直在开发Android吉他应用程序,目前我遇到了HashMap
的一些问题。
总结一下,当我尝试使用HashMap
从get(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而且没有这个问题。
关于如何解决这个问题并最终从地图中获取我的价值的任何想法?
答案 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定义访问数据,因为您已将其定义为: