copyonwritearraylist奇怪的错误

时间:2014-12-02 23:28:54

标签: java list copyonwritearraylist

我有这段代码:

int rnd1=Rnd.get(players.size());
int rnd2=Rnd.get(players.size());

while(rnd2==rnd1)
    rnd2=Rnd.get(players.size());


for(L2PcInstance player : players)
{
    if(player != players.get(rnd1) && player != players.get(rnd2))
           players.remove(player);
}

我有这个错误:

  

线程“GeneralSTPool-8”中的异常java.lang.ArrayIndexOutOfBoundsException:2           at java.util.concurrent.CopyOnWriteArrayList.get(Unknown Source)           at java.util.concurrent.CopyOnWriteArrayList.get(Unknown Source)           在net.sf.l2j.gameserver.model.RandomFight.pickPlayers(RandomFight.java:89)           在net.sf.l2j.gameserver.model.RandomFight $ pickPlayers.run(RandomFight.java:270)           at net.sf.l2j.gameserver.ThreadPoolManager $ RunnableWrapper.run(ThreadPoolManager.java:85)           at java.util.concurrent.Executors $ RunnableAdapter.call(Unknown Source)           at java.util.concurrent.FutureTask.run(Unknown Source)           at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201(未知来源)           at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(Unknown Source)           at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)           at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)           在java.lang.Thread.run(未知来源)

这里发生了什么?第89行是:for(L2PcInstance player : players)。 由于rnd.get()是从0players.size() - 1,所以不应该出现此内容。

1 个答案:

答案 0 :(得分:0)

意图似乎从列表中删除除了两个选定的玩家之外的所有玩家。有更简单的方法可以做到这一点。例如:

players.retainAll(Arrays.asList(players.get(rnd1), players.get(rnd2));

如果您使用CopyOnWriteArrayList的原因,这也不会出现并发修改的问题。

正如评论中已经说过的那样,错误的原因是:玩家索引是在初始列表上生成的,并且在那时它们确实有效。但是,删除循环会减小列表大小,以前生成的索引可以在有效范围之外结束。