-2

我有这个代码:

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

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

4

1 回答 1

1

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

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

如果这是您使用CopyOnWriteArrayList.

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

于 2014-12-02T23:44:27.163 回答