我有这段代码:
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()
是从0
到players.size() - 1
,所以不应该出现此内容。
答案 0 :(得分:0)
意图似乎从列表中删除除了两个选定的玩家之外的所有玩家。有更简单的方法可以做到这一点。例如:
players.retainAll(Arrays.asList(players.get(rnd1), players.get(rnd2));
如果您使用CopyOnWriteArrayList
的原因,这也不会出现并发修改的问题。
正如评论中已经说过的那样,错误的原因是:玩家索引是在初始列表上生成的,并且在那时它们确实有效。但是,删除循环会减小列表大小,以前生成的索引可以在有效范围之外结束。