【发布时间】:2014-01-20 05:01:15
【问题描述】:
我一直在开发一个 Android 吉他应用程序,目前我在使用 HashMap 时遇到了一些问题。
总而言之,当我尝试从带有get(key) 的HashMap 中检索一个值时,尽管containsKey(key) 为该键返回了true,但我得到了一个nullpointer 异常。 p>
具体来说,我有一个类的实例_currentPreset,它有一个名为_maxCoordRange的HashMap,它在类中初始化如下:
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));
}
这是奇怪的部分。当我尝试使用getMaxCoordRange 从HashMap 检索与pareterName 对应的值时,我得到一个空指针异常,尽管containsKey(key) 返回true。
我做了一些调试,发现一些对我来说相当奇怪的东西。 当我将值放入地图中后,在表达式标签中(在 eclipse 中处于调试模式时),表格如下所示:
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)
应该有 10 个值,但有 2 个在元素 14 和 15 的 next 字段中。我读到这是 hashMaps 排列数据的方式以提高效率,但是难道这不是我无法检索值的原因吗?
很抱歉提供了这么多信息,但我真的不知道问题出在哪里。我之前用过HashMaps,没有这个问题。
关于如何解决这个问题并最终从地图中获取我的值的任何想法?
【问题讨论】:
-
如果您在表中有对应值为
null的键,则可能发生NPE。但如果你真的只使用setMaxCoordRange,这不可能发生,因为float会自动装箱。您是否检查了表中的所有条目都具有非null值? -
贴整个类代码和NPE堆栈跟踪会很麻烦吗?
-
此外,由于 getMaxCoordRange() 似乎提供了对哈希映射的不受保护的访问权限,可能是其他一些代码正在向其中添加空值吗?
-
谢谢大家,我终于解决了,当我调试程序时,我认为异常来自'setMaxValueCoord'的参数,但问题是'cord'为空。抱歉……
标签: java android nullpointerexception hashmap