所以我前几天从我们的网络服务器上梳理了一些日志(寻找其他东西),当一些奇怪的东西引起了我的注意。
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中的一个小故障吗?或者只是一场怪胎事故。
我认识到这可能不合时宜。我希望我能了解更多关于发生了什么的信息,但我不知道。
答案 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