0
        do{

        System.out.println("inside do");
        for (int i = 0; i < i2; i++) {

             String s2 = m_area.m_items.get(i).returnName();
             if (s2.contains(s)) {

                itemexist_check = true;
                player.addItem(m_area.m_items.get(i));
                m_area.m_items.remove(i);
                } else {

                 //do nothing
             }
         }
         itemexist_check = true;
        }while(itemexist_check == false);

この do ステートメントが実行されると、問題なく "player.addItem(m_area.m_items.get(i))" が実行されますが、"m_area.m_items.remove(i)" (m_items は LinkedList です) になると、 「OutOfBoundsException: インデックス 1、サイズ 1」をスローします。LinkedList のサイズと "i" の値を出力することで、"m_area.m_items.remove(i)" の前に、LinkedList のサイズが 2 であり、" i" は 0 です。例外がスローされる理由がわかりました。LinkedList には明らかに要素 0 はありません。私が知らないのは、なぜ「player.addItem(m_area.m_items.get(i))」で例外をスローしなかったのですか? 何かが正しくありません。助けてください。

ありがとうございました

4

3 に答える 3

2

I2 はリストのサイズですか? 次に、ループに1回の反復が多すぎます。継続条件は i < i2-1 である必要があります。

いいえ、インデックスが 0 の場合、remove() は例外をスローしません。0 未満の場合のみです。

for-each ループを使用するというアドバイスについては、注意してください。通常、ループ内でリストを変更することはできません。m_area.m_items を変更しているため、ここでは次のような制限が適用されます。

于 2011-10-25T07:12:48.573 に答える
1

最良の方法は、foreach代わりにループを使用for することです。アイテムを削除するには、他のセットに保存し、ループの後に RemoveAll を使用します

for (TypeOfListItem item : m_area.m_items) {

         String s2 = item.returnName();
         if (s2.contains(s)) {

            itemexist_check = true;
            player.addItem(item);
            itemsForDelete.add(item);
            } else {
             //do nothing
         }
     }

m_area.m_items.removeAll(itemsForDelete);

于 2011-10-25T07:09:46.077 に答える
1

リストのトラバーサルと削除を処理する最も安全な方法は、2 つを分離することです。したがって、標準の forearch ループを使用してリストを反復処理します (呼び出しよりもはるかに簡単で高速ですget)。アイテムを削除する代わりに、それを別のリストに追加し、ループの後にm_area.m_items.removeAll(removedElementsList).

于 2011-10-25T07:10:35.923 に答える