البرمجة

تفادي استثناء ConcurrentModificationException في Java

عند النظر إلى الشيفرة البرمجية التي قدمتها، يظهر أن هناك مشكلة تحدث عند تعاملك مع القائمة (List) واستخدام الـ Iterator. الخطأ الذي تلقيته (java.util.ArrayList$Itr.checkForComodification) يشير إلى أن هناك تعديل غير صحيح يحدث على القائمة أثناء تكرارها.

المشكلة الرئيسية تكمن في أنك تقوم بإضافة عنصر جديد إلى القائمة (layerDataList) داخل حلقة while التي تعيد عبر Iterator. هذا يؤدي إلى تعديل Concurrent (تعديل متزامن) على القائمة أثناء التكرار، وهو ما يسبب إلقاء الاستثناء الذي رأيته.

لتصحيح هذا السيناريو، يُفضل استخدام ListIterator بدلاً من Iterator العادي. يتيح لك ListIterator إجراء تعديلات آمنة على القائمة أثناء التكرار. فيما يلي تعديل لشيفرتك:

java
List layerDataList = new ArrayList(); if (layerDataList.isEmpty()) { layerDataList.add(layerData); } ListIterator listIterator = layerDataList.listIterator(); // ListIterator created while (listIterator.hasNext()) { String layerD = listIterator.next(); if (!layerD.equals(layerData)) { listIterator.add(layerData); } }

مع هذا التعديل، يجب أن لا تواجه مشكلة ConcurrentModificationException. يتيح لك ListIterator إضافة عناصر بشكل آمن خلال التكرار، مما يحل المشكلة التي واجهتها.

المزيد من المعلومات

بالتأكيد، دعنا نوسع المناقشة لتعميق فهمك حول هذه المشكلة وكيفية تجنبها في المستقبل.

أولًا وقبل كل شيء، يجب أن نتناول فهم الاستثناء ConcurrentModificationException. هذا الاستثناء يحدث عندما يتم تعديل الهيكل التنظيمي للمجموعة (مثل الإضافة أو الحذف) بشكل غير متزامن أثناء التكرار على العناصر باستخدام Iterator. في حالتك، قمت بإضافة عنصر جديد داخل حلقة while التي تستخدم Iterator، مما تسبب في إثارة الاستثناء.

الحلاقة المعدلة باستخدام ListIterator تتيح لنا إضافة العناصر بشكل آمن، ولكن هناك بعض النقاط الإضافية لتوضيح:

  1. استخدام equals بدلاً من !=: في شرطك داخل الحلقة، قمت باستخدام != لمقارنة السلاسل. يفضل استخدام equals عند مقارنة المحتوى لضمان الدقة. السطر المعدل يستخدم !layerD.equals(layerData).

  2. التحقق من النص الأولي للقائمة (layerDataList) قبل الحلقة: لقد قمت بفحص القائمة لفارغة قبل إضافة العنصر الأول. يمكنك تحسين الكود بالتحقق من القائمة قبل دخول الحلقة، مما يقلل من الاختبارات داخل الحلقة.

java
List layerDataList = new ArrayList(); if (layerDataList.isEmpty()) { layerDataList.add(layerData); } if (!layerDataList.isEmpty()) { ListIterator listIterator = layerDataList.listIterator(); // ListIterator created while (listIterator.hasNext()) { String layerD = listIterator.next(); if (!layerD.equals(layerData)) { listIterator.add(layerData); } } }

باستخدام هذه التحسينات، يمكنك تجنب استثناء ConcurrentModificationException وضمان دقة وسلامة تعديلات القائمة أثناء التكرار.

زر الذهاب إلى الأعلى