我有一个奇怪的例外,我无法重现(来自bugsense):
java.lang.ArrayIndexOutOfBoundsException: length=0; index=1
at java.util.HashMap.addNewEntry(HashMap.java:476)
at java.util.HashMap.put(HashMap.java:408)
ConcurrentHashMap
上的put方法如何抛出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);
}
}
}
许多线程同时调用此方法
感谢。
答案 0 :(得分:5)
堆栈跟踪显示您正在使用Android version of HashMap。
我的诊断是你以某种方式设法获得了一个腐败的HashMap
对象。 addNewEntry
方法正在索引主哈希数组(table
),但数组的长度(显然)为零。这是不应该发生的事情......而且(我认为)只有在扩展阵列时容量计算出错时才会发生这种情况。 (检查代码如何处理空映射...)
可能(我猜)您在使用的Android版本中遇到了HashMap
实施中的错误。但是我认为更有可能腐败是由于您的应用程序在没有正确同步的情况下使用多个线程来使用/更新地图对象。我建议你先探索一下这个理论;即检查同步。
我不知道为什么更新的问题在讨论ConcurrentHashMap
。 stacktrace 中的证据显然表明问题发生在HashMap
。我只准备根据我能看到的实际证据提供诊断。