2011-10-25 3 views
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); 

는 행복하게 "player.addItem (m_area.m_items.get (i)를)"수행, 실행되지만, 그것은 (에 "m_area.m_items.remove을 얻을 때 i) "(m_items는 LinkedList 임),"OutOfBoundsException : Index 1, Size 1 "을 발생시킵니다. "i"값을 인쇄 할뿐만 아니라 LinkedList의 크기를 인쇄하여 "m_area.m_items.remove (i)"이전에 LinkedList의 크기가 2이고 " 나는 그것이 0 인 이유를 이해했다. LinkedList에는 요소 0이 없습니다. 왜 내가 "player.addItem (m_area.m_items.get (i))"에 예외를 던지지 않았는지 모르겠습니다. 뭔가 이상한 것이 있습니다. 제발 도와주세요. 자바 : 이상한 OutOfBoundsException이 문을

+0

오. 분명히 LinkedList.get은 인덱스가 0보다 작을 때 예외를 throw하지만 LinkedList.remove는 인덱스가 0 일 때 예외를 throw합니다. 내 실제 질문은 어떻게하면 코드를 수정할 수 있습니까? – Blackvein

+0

질문이 명확하지 않습니다. 예를 들어. 'i2'가 가리키는 점은 무엇입니까? –

+0

올바르지 않습니다. [LinkedList.get] (http://download.oracle.com/javase/7/docs/api/java/util/LinkedList.html#get%28int%29) throws'IndexOutOfBoundsException' - 인덱스가 범위를 벗어난 경우 –

답변

1

목록 통과 + 제거를 처리하는 가장 유익한 방법은 두 가지를 분리하는 것입니다. 따라서 표준 forearch 루프를 사용하여 목록을 반복합니다 (get 호출보다 쉽고 빠름). 항목을 제거하는 대신 별도의 목록에 추가하고 루프 후 m_area.m_items.removeAll(removedElementsList)을 사용하십시오.

1

가장 좋은 방법은 대신 for 및 항목을 제거 foreach 루프를 사용하여 감사합니다 다른 세트에서 자신을 저장하고 (TypeOfListItem 항목 : m_area.m_items)에 대한 루프

후에서 removeAll을 사용하여 {

  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);

2

목록의 크기는 I2입니까? 그렇다면 너무 많은 루프 반복에 머물러 있습니다. 당신은 계속 조건이 내가 < i2-1이어야합니다.

아니요. index가 0 일 때 remove()가 예외를 발생시키지 않습니다. 0보다 작은 경우에만 예외가 throw됩니다.

for-each 루프를 사용하는 것에 대한 조언은주의하십시오. 일반적으로 루프 내에서 목록을 수정할 수 없습니다. m_area.m_items를 수정하기 때문에 여기에 적용되는 것과 같은 제한이 적용됩니다.