दिलचस्प पोस्ट
जावा के संरक्षित संशोधक को समझना ioctl बनाम नेटलिंक बनाम मेमॅप कर्नेल स्थान और उपयोगकर्ता स्थान के बीच संवाद करने के लिए जब मैं डीबगिंग समाप्त करता हूं, तो मेरी IIS एक्सप्रेस एप बंद करने से विजुअल स्टूडियो 2013 को कैसे रोका जा सकता है? HTML पृष्ठ लोड करने के लिए JSONP का उपयोग करें पाठ फ़ाइल से पढ़ना जब तक EOF अंतिम पंक्ति को दोहराता नहीं कॉल विरामण त्रुटि को अस्वीकार करने के साथ वादा निर्माता api-ms-win-crt-runtime-l1-1-0.dll अनुपलब्ध है जब Microsoft Office फ़ाइल खोलते हैं उपयोग किया गया SelectionRowAtIndexPath या UITableView के लिए FORASEEGE विधि? ऑपरेटर "[<-" आरस्टुडियो और आर में नेट में लेनदेन आरजीबी रंग की चमक निर्धारित करने के लिए फॉर्मूला XCode 3.2.3 w / iPhone SDK 4 स्थापित करें, "बेस एसडीके लापता" प्राप्त करें, अन्य एसडीके नहीं देख सकते हैं ओपन एनएफसी एमुलेटर के साथ आरंभ करना एचटीटीपीएसर्वेटरेक्स्ट से जेएसओएन ऑब्जेक्ट को प्राप्त करना मैं जावास्क्रिप्ट के साथ फाइल एक्सटेंशन कैसे प्राप्त करूं?

समवर्ती संशोधन अपवाद: एक ArrayList को जोड़ना

समस्या तब होती है

Element element = it.next(); 

और यह कोड जिसमें उस रेखा शामिल है, एक OnTouchEvent अंदर है

 for (Iterator<Element> it = mElements.iterator(); it.hasNext();){ Element element = it.next(); if(touchX > element.mX && touchX < element.mX + element.mBitmap.getWidth() && touchY > element.mY && touchY < element.mY + element.mBitmap.getHeight()) { //irrelevant stuff.. if(element.cFlag){ mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); element.cFlag = false; } } } 

यह सब synchronized(mElements) अंदर है, जहां mElements एक mElements ArrayList<Element>

जब मैं एक Element स्पर्श करता हूं, तो वह cFlag को सक्रिय कर सकता है, जो अलग-अलग गुणों के साथ एक और Element बना देगा, जो स्क्रीन से गिर जाएगी और एक सेकंड से भी कम समय में खुद को नष्ट कर देगा। यह कण प्रभाव पैदा करने का मेरा तरीका है हम इस "कण" crack को कंस्ट्रक्टर में स्ट्रिंग पैरामीटर की तरह कॉल कर सकते हैं।

यह सब ठीक काम करता है जब तक कि मैं किसी अन्य मुख्य Element जोड़ूं। अब मेरे पास एक ही समय में स्क्रीन पर दो Elements , और अगर मैं नवीनतम Element स्पर्श करता हूं, तो यह ठीक काम करता है, और कणों को लॉन्च करता है

हालांकि, अगर मैं पुराने Element पर cFlag को स्पर्श और सक्रिय करता cFlag , तो यह मुझे अपवाद देता है।

  07-28 15:36:59.815: ERROR/AndroidRuntime(4026): FATAL EXCEPTION: main 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): java.util.ConcurrentModificationException 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.Juggle2.Panel.onTouchEvent(Panel.java:823) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.view.View.dispatchTouchEvent(View.java:3766) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1767) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1119) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1751) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.os.Handler.dispatchMessage(Handler.java:99) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.os.Looper.loop(Looper.java:123) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at android.app.ActivityThread.main(ActivityThread.java:4627) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at java.lang.reflect.Method.invokeNative(Native Method) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at java.lang.reflect.Method.invoke(Method.java:521) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:651) 07-28 15:36:59.815: ERROR/AndroidRuntime(4026): at dalvik.system.NativeStart.main(Native Method) 

मै इसे काम मे कैसे ले सकता हूँ?

Solutions Collecting From Web of "समवर्ती संशोधन अपवाद: एक ArrayList को जोड़ना"

ConcurrentModificationException तब होता है जब आप Iterator साथ एक सूची में चलते समय सूची (तत्वों को जोड़कर या हटाकर) संशोधित करते हैं

प्रयत्न

 List<Element> thingsToBeAdd = new ArrayList<Element>(); for(Iterator<Element> it = mElements.iterator(); it.hasNext();) { Element element = it.next(); if(...) { //irrelevant stuff.. if(element.cFlag){ // mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); thingsToBeAdd.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); element.cFlag = false; } } } mElements.addAll(thingsToBeAdd ); 

जॉन के सुझाव के रूप में आपको प्रत्येक लूप के लिए बढ़ाया जाना चाहिए।

मैं आमतौर पर इस तरह से कुछ का उपयोग करें:

 for (Element element : new ArrayList<Element>(mElements)) { ... } 

त्वरित, स्वच्छ और बग मुक्त

एक अन्य विकल्प CopyOnWriteArrayList का उपयोग करना है

आपको किसी संग्रह में एक प्रविष्टि जोड़ने की अनुमति नहीं है, जब तक आप इसे फिर से कर रहे हैं

एक विकल्प नई प्रविष्टियों के लिए List<Element> को नई प्रविष्टियों के लिए mElements , जब आप mElements पर पुनरावृत्त हो mElements , और उसके बाद सभी नए लोगों को mElement बाद में जोड़ें ( mElements.addAll(newElements) )। बेशक, इसका मतलब है कि आप उन नए तत्वों के लिए लूप बॉडी को निष्पादित नहीं करेंगे – क्या यह समस्या है?

उसी समय, मैं सुझा था कि आप लूप के लिए एन्हांस्ड उपयोग करने के लिए अपना कोड अपडेट करें:

 for (Element element : mElements) { ... } 

लूप के लिए अनुक्रमित भी काम करना चाहिए।

 for (int i = 0; i < collection.size(); i++) 

इस मामले में सूची से जोड़ना सीएमई की ओर जाता है, synchronized की कोई भी राशि आपको इससे बचने नहीं देगी इसके बजाय, इटरेटर का उपयोग करने पर विचार करें …

  for(ListIterator<Element> it = mElements.listIterator(); it.hasNext();){ Element element = it.next(); if(touchX > element.mX && touchX < element.mX + element.mBitmap.getWidth() && touchY > element.mY && touchY < element.mY + element.mBitmap.getHeight()) { //irrelevant stuff.. if(element.cFlag){ // mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); it.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); element.cFlag = false; } } } 

इसके अलावा मुझे लगता है कि यह राज्य की तरह कुछ फिसलन है …

Element element = it.next(); पर समस्या आती है Element element = it.next();

परिशुद्धता के लिए ध्यान दें कि ऊपर की गारंटी नहीं है।

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

Iterators का उपयोग भी concurrency समस्याओं को हल करता है, इस तरह:

 Iterator<Object> it = iterator.next().iterator(); while (it.hasNext()) { it.remove(); } 

मैंने अपने मामले में सभी पहलुओं की कोशिश की है, जहां मैं एक एडेप्टर में एक सूची बदल रहा था लेकिन फिर से और फिर से मारने के कारण मुझे दिखाया गया कि अपवाद का संदेश फेंका गया है। मैंने सूची को कास्ट करने की कोशिश की

  = (CopyOnWriteArraylist<MyClass>)mylist.value; 

लेकिन यह भी मुझे सीनोटकस्ट एक्सपैशन के अपवाद को फेंक दिया, (और मैंने अंततः इस तथ्य पर विचार किया कि वे क्यों का उपयोग करते हैं या हमें ढलाई की एक विशेषता प्रदान करते हैं)

मैंने भी तथाकथित सिंक्रनाइज़ ब्लॉक का भी इस्तेमाल किया, लेकिन यह भी काम नहीं कर रहा था या मैं इसे गलत तरीके से इस्तेमाल कर रहा होता।

इस प्रकार यह तब था जब मैंने आखिरकार # सभी समय का इस्तेमाल किया + अपवाद को पकड़ने के प्रयास में अपवाद को संभालने की तकनीक, और यह काम किया, इसलिए अपना कोड डालकर

 try{ //block }catch(ConcurrentModificationException){ //thus handling my code over here }