ConcurrentModificationException در جاوا چیست؟
مثال
بیایید به مثالی از چگونگی این استثنا نگاه کنیم.import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver1 {
public static void main(String[] args) {
List<String> businessDays = new ArrayList<>();
businessDays.add("Monday");
businessDays.add("Tuesday");
businessDays.add("Wednesday");
businessDays.add("Thursday");
businessDays.add("Friday");
businessDays.add("Saturday");
businessDays.add("Sunday");
Iterator<String> iterator = businessDays.iterator();
while (iterator.hasNext()) {
String day = iterator.next();
if (day.equals("Sunday")) {
// removing a list item while iterating
// leading to java.util.ConcurrentModificationException
businessDays.remove(day);
}
}
}
}
خروجی
استثنا در رشته "main" java.util.ConcurrentModificationException در java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) در java.base/java.util.ArrayList$Itr.next.javaray :996) در milestone.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)
چگونه از ConcurrentModificationException در جاوا جلوگیری کنیم؟
راه حل های مختلفی برای ConcurrentModificationException وجود دارد . در اینجا تعدادی فهرست شده است. شما می توانید هر کسی را بر اساس نیاز خود انتخاب کنید.- از اصلاح در حین تکرار اجتناب کنید.
- از حلقه های سنتی برای تکرار و اصلاح همزمان استفاده کنید.
- یک کپی از مقادیر ایجاد کنید تا در حین استفاده از تکرار کننده ها اصلاح شوند. پس از اتمام تکرار، مقادیر را به روز کنید.
مثال
در اینجا مثالی از نحوه اجتناب از ConcurrentModificationException آورده شده است .import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver2 {
public static void main(String[] args) {
List<String> businessDays = new ArrayList<>();
businessDays.add("Monday");
businessDays.add("Tuesday");
businessDays.add("Wednesday");
businessDays.add("Thursday");
businessDays.add("Friday");
businessDays.add("Saturday");
businessDays.add("Sunday");
System.out.println("Initial Business Days: " + businessDays);
// Method II - Using traditional for loop
for (int i = 0; i < businessDays.size(); i++) {
if (businessDays.get(i).equals("Sunday")) {
businessDays.remove(i);
}
}
Iterator<String> iterator = businessDays.iterator();
List<String> businessDaysToBeRemoved = new ArrayList<>();
// Method III - Creating a copy of elements
while (iterator.hasNext()) {
String day = iterator.next();
if (day.equals("Saturday")) {
// Add values to be removed in the list
businessDaysToBeRemoved.add(day);
}
}
businessDays.removeAll(businessDaysToBeRemoved);
System.out.println("Final Business Days: " + businessDays);
}
}
خروجی
روزهای کاری اولیه: [دوشنبه، سه شنبه، چهارشنبه، پنجشنبه، جمعه، شنبه، یکشنبه] آخرین روزهای کاری: [دوشنبه، سه شنبه، چهارشنبه، پنجشنبه، جمعه]
GO TO FULL VERSION