![](/img/trans.png)
[英]Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 15, Size: 5
[英]IndexOutOfBoundsException: Index: 15, Size: 19
所以前幾天我正在從我們的網絡服務器中梳理一些日志(尋找其他東西),這時一些奇怪的東西引起了我的注意。
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中的一個小故障嗎? 或者只是一場奇怪的事故。
我知道這可能是題外話。 我希望我有更多關於發生的事情的信息,但我沒有。
ArrayList 不是多線程安全的。 如果它在大約被另一個線程訪問時被一個線程修改,則在運行測試時index >= size
可能為真,但在構建消息時為假。
這應該能夠發生嗎? 這是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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.