【问题标题】:null pointer exception when retrieving from HashMap even though containsKey() returns true从 HashMap 检索时出现空指针异常,即使 containsKey() 返回 true
【发布时间】:2014-01-20 05:01:15
【问题描述】:

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

总而言之,当我尝试从带有get(key)HashMap 中检索一个值时,尽管containsKey(key) 为该键返回了true,但我得到了一个nullpointer 异常。 p>

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

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));
}

这是奇怪的部分。当我尝试使用getMaxCoordRangeHashMap 检索与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


【解决方案1】:

可能是您同时使用带有索引和字符串的“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 有效,请坚持通过您定义的字符串访问数据:

【讨论】:

  • 其实我是这样做的,因为 pareterName(应该是 parameterName)是一个字符串,和从 _currentPreset.getParNames().get(i) 获得但作为参数传递给执行上述 if 的函数
猜你喜欢
  • 2023-03-07
  • 2020-08-30
  • 1970-01-01
  • 2023-03-06
  • 2021-10-05
  • 1970-01-01
  • 2023-03-05
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多