首页 文章

copyonwritearraylist奇怪的错误

提问于
浏览
-3

我有这个代码:

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)at net.sf.l2j .gameserver.model.RandomFight.pickPlayers(RandomFight.java:89)at 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 . 访问$ java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(未知来源)java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源)java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知)访问$ 201(未知来源)来源)在java.lang.Thread.run(未知来源)

这里发生了什么?第89行是这样的: for(L2PcInstance player : players) . 这应该不会出现,因为 rnd.get() 是从 0players.size() - 1 .

1 回答

  • 0

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

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

    如果这是你使用 CopyOnWriteArrayList 的原因,这也没有并发修改的问题 .

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

相关问题