2013-07-27 4 views
7

निम्न कोड ConcurrentModificationExcrption क्यों फेंकता है, जब मैं मास्टर सूची के बाद उप सूची साफ़ करता हूं, लेकिन यदि मैं उप सूची को साफ़ करता हूं और फिर मास्टर सूची को साफ़ करता हूं?समवर्ती मोडिफिकेशन एक्सेप्शन जब एक उप सूची

ArrayList<Integer> masterList = new ArrayList<Integer>(); 
List<Integer> subList; 

// Add some values to the masterList 
for (int i = 0; i < 10; i++) { 
    masterList.add(i * i); 
} 

// Extract a subList from the masterList 
subList = masterList.subList(5, masterList.size() - 1); 

// The below throws ConcurrentModificationException 
masterList.clear(); 
subList.clear(); // Exception thrown in this line 

// The below doesn't throw any exception 
subList.clear(); 
masterList.clear(); // No exception thrown. Confused?? 

उत्तर

4

SubList एक स्वतंत्र इकाई नहीं है, लेकिन यह केवल मूल सूची का दृश्य दे रहा है, और आंतरिक रूप से उसी सूची को संदर्भित करता है। इसलिए, इसका डिजाइन ऐसा प्रतीत होता है कि यदि अंतर्निहित सूची संरचनात्मक रूप से संशोधित की जाती है (तत्वों को जोड़ना/निकालना), तो यह इसके अनुबंध को पूरा करने में सक्षम नहीं है।

रूप here in the source code of SubListcheckForComodification जाँच करता है कि अंतर्निहित सूची संशोधित किया गया है देखा जा सकता है, विधि, और इस प्रकार यदि modCount (समय की संख्या सूची संरचनात्मक रूप से संशोधित किया गया है) SubList का मूल्य नहीं माता पिता ArrayList के रूप में ही है, तो, है यह ConcurrentModificationException

फेंकता है तो, माता पिता ArrayList जहाँ से SubListSubList के कुछ आपरेशनों में परिणाम ConcurrentModificationException में परिणाम की subList तरह masterList एक के तत्वों को संदर्भित करता है

+0

यह बहुत जानकारीपूर्ण है। धन्यवाद। –

2

subListmasterList पर एक दृश्य है। केवल 1 अंतर्निहित संग्रह है। अब मास्टरलिस्ट उपन्यास के superset की तरह है। तो,

  • sublist मौजूद नहीं कर सकते, तो masterlist's तत्वों निकाल दिए जाते हैं // अपवाद मामला अगर sublist's तत्वों को निकाल दिया जाता
  • masterlist मौजूद कर सकते हैं // ठीक
+0

यह है सकते हैं बनाया गया था समाशोधन और जब मैं masterList.clear() करता हूं, संदर्भ नष्ट हो जाते हैं और subList.clear() एक अपवाद फेंकता है? –

2

ArrayList docsubList() के अनुसार एक sublist कि समर्थित है रिटर्न मूल ArrayList द्वारा, इसलिए यदि मूल परिवर्तन उपसूची करता है, तो जब आप subList.clear() निष्पादित करते हैं तो उपन्यास स्वयं मौजूद नहीं होता है।

2

the API docs से:

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

निश्चित रूप से अपरिभाषित अर्थ विज्ञान का मतलब है कि यह एक अपवाद फेंक करने की अनुमति है (और वास्तव में यह शायद कार्रवाई का सबसे बुद्धिमान तरीका है)।

तो आप उपन्यासकार का आकार बदल सकते हैं और उन परिवर्तनों को मुख्य सूची में प्रतिबिंबित कर सकते हैं, लेकिन विपरीत नहीं है।

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