IndexOutOfBoundsException:索引:15,大小:19

时间:2014-07-24 20:14:48

标签: java indexoutofboundsexception

所以我前几天从我们的网络服务器上梳理了一些日志(寻找其他东西),当一些奇怪的东西引起了我的注意。

java.lang.IndexOutOfBoundsException: Index: 15, Size: 19
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)

这对我来说似乎不可能。

我查了ArrayList#rangeCheck的源代码,这让我大吃一惊

private void rangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

根据我收到的消息,永远不会发生。

不幸的是,我现在还不知道内容是什么(这可以从用于很多事情的代码中调用)。我一直无法重现它。我甚至不知道我从哪里开始。

问题:这是否应该发生?这是Java中的一个小故障吗?或者只是一场怪胎事故。

我认识到这可能不合时宜。我希望我能了解更多关于发生了什么的信息,但我不知道。

2 个答案:

答案 0 :(得分:5)

ArrayList不是多线程安全的。如果在大约另一个线程访问时被一个线程修改,那么index >= size在测试运行时可能是真的,但在构建消息时是假的。

答案 1 :(得分:3)

  

这是否应该发生?这是Java中的一个小故障吗?或者只是一场怪胎事故。

以上所有。

让我们想象您在一个线程中添加ArrayList并在另一个线程中访问它。

假设您的大小为14,但您可以访问索引15

T1: if (index >= size) // is true
T2: for(int i=0;i<5;i++) list.add(N); // so now we have 19.
T1: outOfBoundsMsg(index); // Index: 15, Size: 19