-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. java.util.concurrent.Executors$RunnableAdapter.call で実行 (ThreadPoolManager.java:85) java.util.concurrent.FutureTask.run (不明なソース) で java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access でjava.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask で $201 (不明なソース)。java.util.concurrent.ThreadPoolExecutor.runWorker で実行 (未知のソース) java.util.concurrent.ThreadPoolExecutor$Worker.run (未知のソース) で java.lang.Thread.run (未知のソース) で

ここで何が起こっているのですか?89 行目は次のとおりfor(L2PcInstance player : players)です。rnd.get()から0までなので、これは表示されませんplayers.size() - 1

4

1 に答える 1

1

この意図は、選択した 2 人のプレーヤーを除くすべてをリストから削除するようです。もっと簡単な方法があります。例えば:

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

を使用する理由がCopyOnWriteArrayList.

コメントで既に述べたように、エラーの理由は次のとおりです。プレーヤーのインデックスは初期リストで生成され、その時点でそれらは実際に有効です。ただし、削除ループによってリストのサイズが減少し、以前に生成されたインデックスが有効な範囲外で終了する可能性があります。

于 2014-12-02T23:44:27.163 に答える