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