2015-10-28 7 views
6

फास्ट विफल: जिसका अर्थ है कि अगर वे का पता लगाने कि संग्रह के बाद से यात्रा शुरू कर दिया बदल गया है, वे अनियंत्रित ConcurrentModificationException फेंक देते हैं।फास्ट असफल - अपवाद केवल तब होता है जब कोई तत्व जोड़ जब न निकालने की

मैं एक परीक्षण उदाहरण इस demonsterate के लिए लिखा है:

String hi = "Hi"; 
    list.add(hi); 
    list.add("Buy"); 
    System.out.println("list before: " + list); 
    for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) { 
     String string = iterator.next(); 
     list.add("Good"); 
    } 

उत्पादन होता है:

list before: [Hi, Buy] 
Exception in thread "main" java.util.ConcurrentModificationException 
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) 
    at java.util.ArrayList$Itr.next(ArrayList.java:831) 
    at thread.CollectionTest.main(CollectionTest.java:19) 

जो उम्मीद है। हालांकि, जब एक तत्व निकाल दिया जाता है, अपवाद नहीं है:

List<String> list = new ArrayList<>(); 

    String hi = "Hi"; 
    list.add(hi); 
    list.add("Buy"); 
    System.out.println("list before: " + list); 
    for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) { 
     String string = iterator.next(); 
     list.remove(hi); 
    } 

आउटपुट:

list before: [Hi, Buy] 
list after: [Buy] 

कि क्यों है? दोनों मामलों में सूची संशोधित है।

+1

'iterator.next()' से पहले हटाने का प्रयास करें या 3 प्रविष्टियों के साथ प्रयास करें ... – Fildor

+0

समवर्ती मोडिफिकेशन एक्सेप्शन फेंक देगा जब आप पुनरावृत्ति के दौरान तत्व हटाते हैं। आपके मामले में आप अगली() को कॉल करते हैं और फिर आप ऑब्जेक्ट को हटा देते हैं। – Truthira

+0

@ थिनिगाइरासु मैं हालांकि 'हैनक्स्ट() 'अपवाद भी – Sam

उत्तर

1

मुद्दा यह है कि यह hasNext() कि संशोधन के लिए जाँच करता है, लेकिन next() नहीं है। अपने "हटाएं" परिदृश्य में, आप next कॉल दबाएं जो फेंक देगा क्योंकि कोई अगला तत्व नहीं है।

यदि आपके पास शुरुआत में 3 तत्व थे, तो एक को हटाने से hasNext 'सत्य' होने का परिणाम होगा। फिर निम्नलिखित next अपेक्षित अपवाद फेंक देगा।

जावाडोक बताता है कि "असफल-तेज" कार्यक्षमता "सर्वोत्तम प्रयास" के आधार पर काम करती है और इसका उपयोग केवल प्रोग्राम के लिए सही ढंग से व्यवहार करने के लिए इसके आधार पर बग का पता लगाने के लिए किया जाएगा। स्पष्ट रूप से इस तरह के दुष्प्रभावों के कारण।

0

ConcurrentModificationException फेंक देगा, आप पुनरावृत्ति के दौरान सूची में कुछ संशोधन कर सकते हैं।

पुनरावृत्ति के दौरान सूची में संशोधन करने के बाद, यदि आप इटरेटर का उपयोग कर अगले() या निकालें() तक पहुंचने का प्रयास करते हैं, तो यह modCount और अपेक्षित मोडकॉउंट और गिनती को सत्यापित नहीं करता है, तो यह ConcurrentModificationException फेंक देता है।

final void checkForComodification() { 
      if (modCount != expectedModCount) 
       throw new ConcurrentModificationException(); 
     } 
संबंधित मुद्दे