HashMap中的ArrayIndexOutOfBoundsException

ido*_*dog 3 java android hashmap

我有一个奇怪的例外,我无法重现(来自bugsense):

java.lang.ArrayIndexOutOfBoundsException: length=0; index=1
at java.util.HashMap.addNewEntry(HashMap.java:476)
at java.util.HashMap.put(HashMap.java:408)
Run Code Online (Sandbox Code Playgroud)

怎么会放方法上ConcurrentHashMap可以抛出ArrayIndexOutOfBoundsException?(我也尝试使用ConcurrentHashMap,但没有任何运气)

有任何想法吗?

编辑:

添加代码:

final Map<String, DataSource> dataSources = new ConcurrentHashMap<String, DataSource>();
public void setDataSource(@Nonnull String field, @Nullable DataSource source) {
    // concurrent hash map doesnt allow null values
    if (field != null) {
        if (source != null) {
            dataSources.put(field, source);
        } else {
            dataSources.remove(field);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

许多线程同时调用此方法

谢谢.

Ste*_*n C 5

stacktrace显示您正在使用Android版本的HashMap.

我的诊断是你以某种方式设法得到一个腐败的HashMap对象.该addNewEntry方法索引主哈希数组(table),但数组的长度(显然)为零.这是不应该发生的事情......而且(我认为)只有在扩展阵列时容量计算出错时才会发生这种情况.(检查代码如何处理空映射...)

可能(我猜)HashMap您在使用的Android版本中遇到了一个错误.但是我认为腐败更可能是由于您的应用程序在没有正确同步的情况下使用多个线程来使用/更新地图对象.我建议你先探索一下这个理论; 即检查您的同步.


我不知道为什么更新的问题在讨论ConcurrentHashMap.堆栈跟踪中的证据清楚地表明问题发生在HashMap.我只准备根据我能看到的实际证据提供诊断.