2011-04-13 10 views
6

यहाँ मेरी कोड है:"java.util.ConcurrentModificationException" के साथ अटक

// eventList is a LinkedList 

public void run() { 

    Iterator<Event> it = eventList.iterator(); 
    int size = eventList.size(); 

    while(size > 0) { 
     while(it.hasNext()) { 
      Event e = it.next(); //flaged line 

      if(e.ready()) { 
       System.out.println(e); 
       e.action(); 
       eventList.remove(e); 
       --size; 
      } 
     } 
    } 
} 

त्रुटि java.util.ConcurrentModificationException झंडा लाइन (Event e = it.next();) में फेंक दिया है। क्या आप मेरे कोड में एक गलती देखते हैं जो उस अपवाद को फेंकने का कारण स्पष्ट करता है?

+0

संभावित डुप्लिकेट [निकालने के साथ सूची पर लूप] (http://stackoverflow.com/questions/1921104/loop-on-list-with-remove) – McDowell

उत्तर

17

संशोधित करते समय का उपयोग करते समय आप eventList संशोधित कर रहे हैं। आपको यह नहीं करना चाहिए, या Iterator अनुपयोगी हो जाता है।

it.remove() के साथ बस बदलें और यह ठीक होना चाहिए।

इसके अलावा, आप आसानी से एक अंतहीन लूप में चल सकता है या अपने घटनाओं में से एक है क्योंकि it.hasNext()true वापस कभी नहीं होगा एक बार यह false लौटे पहली बार चलाने में तैयार नहीं है, लेकिन size या तो संशोधित नहीं किया जाएगा। एक समाधान पूरे Iterator it = ... लाइन के अंदर while लूप को स्थानांतरित करना होगा।

मैं eventList के आकार को ट्रैक करने की कोशिश करने के बजाय while (!e.isEmpty()) का उपयोग करने के लिए बाहरी while पाश को भी संशोधित करता हूं।

+0

इस उत्तर के लिए +1; सिर्फ एक नोट, इस समस्या को उस अपवाद के लिए दस्तावेज़ों में वर्णित किया गया है: http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html –

+0

धन्यवाद। मुझे लगता है कि समस्या यह थी कि मैंने कोड पर अधिक समय देखा :) धन्यवाद। – artaxerxe

1

आपको इटरेटर के माध्यम से तत्व को हटा देना चाहिए, अन्यथा इटरेटर रीसेट हो जाता है क्योंकि अंतर्निहित संग्रह बदल जाता है।

संबंधित मुद्दे