exception - java.util.ConcurrentModificationException not thrown when expected -


निम्न कोड फेंकता है, जैसा कि अपेक्षित:

  सार्वजनिक शून्य परीक्षण () {ArrayList & lt ; स्ट्रिंग & gt; MyList = नया अर्रेसूची & lt; स्ट्रिंग & gt; (); MyList.add ("स्ट्रिंग 1"); MyList.add ("स्ट्रिंग 2"); MyList.add ("स्ट्रिंग 3"); MyList.add ("स्ट्रिंग 4"); MyList.add ("स्ट्रिंग 5"); (स्ट्रिंग के लिए: myList) {if (s.equals ("String 2")) {myList.remove (एस); हालांकि, निम्न कोड  नहीं  अपवाद को फेंक देता है, जबकि मैं इसे फेंकने की अपेक्षा करता हूं:  
  सार्वजनिक शून्य परीक्षण () {ArrayList & lt; स्ट्रिंग & gt; MyList = नया अर्रेसूची & lt; स्ट्रिंग & gt; (); MyList.add ("स्ट्रिंग 1"); MyList.add ("स्ट्रिंग 2"); MyList.add ("स्ट्रिंग 3"); (स्ट्रिंग के लिए: myList) {if (s.equals ("String 2")) {myList.remove (एस); }}}  

अंतर यह है कि पहली सूची में 5 आइटम शामिल हैं, जबकि दूसरी सूची में 3. जो प्रयोग किया जाता है JVM:

  जावा संस्करण " 1.8.0 "जावा (टीएम) एसई रनटाइम पर्यावरण (बिल्ड 1.8.0-बी 1 32) जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वीएम (25.0-बी 70, मिश्रित मोड का निर्माण)  

प्रश्न: क्यों नहीं कोड का दूसरा टुकड़ा java.util.ConcurrentModificationException फेंकता है?

इरेटरेटर को ArrayList.iterator () से कार्यान्वयन से लौटा दिया गया है, हम स्पष्ट रूप से दोनों में next () , नहीं को hasNext () के कॉल में। उत्तरार्द्ध इस तरह दिखता है (जावा 8 के नीचे):

  सार्वजनिक बूलियन में अगला () {वापसी कर्सर! = आकार; }  

तो आपके द्वितीय मामले में, इटरेटर "जानता है" कि यह दो तत्वों को वापस कर चुका है, और यह सूची केवल है दो तत्व ... इसलिए हैसैग () अभी गलत देता है, और हम कभी भी को कॉलिंग नहीं करते हैं (तीसरे बार)।

मैं इसे एक कार्यान्वयन विवरण के रूप में देखूंगा - मूल रूप से यह हो सकता है कि सख्त होने की जांच न करें। hasNext () के लिए यह पूरी तरह से उचित होगा कि इस मामले में जांच करें और एक अपवाद डालें।


Comments

Popular posts from this blog

java - org.apache.http.ProtocolException: Target host is not specified -

java - Gradle dependencies: compile project by relative path -

ruby on rails - Object doesn't support #inspect when used with .include -