【问题标题】:ArrayIndexOutOfBoundsException in HashMapHashMap 中的 ArrayIndexOutOfBoundsException
【发布时间】:2014-01-29 13:11:58
【问题描述】:

我有一个无法重现的奇怪异常(来自 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);
        }
    }
}

多个线程同时调用该方法

谢谢。

【问题讨论】:

  • 相关代码是什么?
  • 您是否有多个线程访问地图?如果是这样,则可能存在一个潜在问题,即一个线程调整后备数组的大小,而另一个线程尝试放置一个新条目。
  • 是的,那里有几个线程,但我也尝试使用ConcurrentHashMap,但没有任何运气。
  • 读者请注意stacktrace与OP后面添加的代码不匹配。这不是 ConcurrentHashMap 中存在问题的证据。

标签: java android hashmap


【解决方案1】:

堆栈跟踪显示您正在使用Android version of HashMap

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

可能(我猜)您在使用的 Android 版本中遇到了 HashMap 实现中的错误。但是,我认为更有可能损坏是由于您的应用程序使用/使用多个线程更新地图对象而没有正确同步。我建议您先探索该理论;即检查您的同步。


我不知道为什么更新的问题是在谈论ConcurrentHashMap。 stacktrace 中的证据清楚地表明问题出在HashMap。我只准备根据我能看到的实际证据提供诊断。

【讨论】:

  • 使用ConcurrentHashMap同步地图还不够?
  • 我原以为会这样。但老实说,我想先看看 SSCCE,然后再做出判断。
  • 您添加的代码显示您使用ConcurrentHashMap。但是失败发生在你使用HashMap的时候(你说不能复现!)。故障可重现吗?更新版本会发生这种情况吗?堆栈跟踪在哪里?您实际使用的是哪个版本的 Android? (你能提供那个类的确切版本的源代码的链接吗???)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2012-06-01
  • 2014-02-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
相关资源
最近更新 更多