پرتاب نشدن ConcurrentModificationException

+1 رأی
میانگین بازدید روزانه 0.1437 بازدید

در آموزش‌های جاوا کاپ (Containers and Datu structure)، در بخشی که در مورد Iterator است، به این صورت گفته شده که اگر وقتی با استفاده از for each یک لیست را پیمایش کنیم و در هنگام پیمایش یک عنصر از لیست و حذف کنیم، اکسپشن گفته شده پرتاب میشه. اما به کد زیر دقت کنید:

import java.util.ArrayList;
import java.util.List;

public class MainApp {

	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("Java");
		list.add("Python");
		list.add("PHP");
		list.add("Java Script");
		list.add("C++");

		for (String string : list) {
			if (string.equals("Java Script")) {
				list.remove(string);
			} else {
				System.out.println(string);
			}
		}

	}

}

با اجرای برنامه بالا، هیچ اکسپشنی پرتاب نمیشه و خروجی برنامه میشه این:

Java
Python
PHP

اما اگر به آخر لیست بالا، یک عنصر دیگه اضافه کنیم، در این صورت اکسپشن به وجود میاد. علت چیه؟ چرا اینطوری میشه؟

سوال 8 ماه قبل در تالار برنامه نویسی توسط Sina Deuxshiri (416 امتیاز)
ویرایش 8 ماه قبل توسط Saeed Zarinfam

1 جواب

+2 رأی
 
بهترین جواب

اگر که جاواداک java.util.ListIterator رو یه نگاهی بندازی نوشته که متد remove آخرین المانی رو حذف می کنه که توسط متد next یا previous برگردونده میشه و این یعنی cursor در متد remove معنی نداره و فقط روی آخرین المان صدا زده شده عمل می کنه بخاطر همینه که پس از حذف المان های لیست یدونه به عقب رانده میشه
مثلا کد زیر اعداد زوج رو پرینت می کنه

List<Integer> lst = new ArrayList<>();
            lst.add(0);
            lst.add(1);
            lst.add(2);
            lst.add(3);
            lst.add(4);
            lst.add(5);
            lst.add(6);
            for (int i = 0; i < lst.size(); i++)
            {
                System.out.println(lst.get(i));
                lst.remove(i);
            }

پس اگر در همون کد خودت شرط رو حذف کنی در آخر در اون متد هم concurrentmodificationexception پرتاب میشه

جواب 8 ماه قبل توسط jedlab (290 امتیاز)
انتخاب شده در 8 ماه قبل توسط Sina Deuxshiri

سوال های مشابه

0 رأی
1 جواب میانگین بازدید روزانه 0.1141 بازدید
0 رأی
0 جواب میانگین بازدید روزانه 0.2761 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.0765 بازدید
0 رأی
0 جواب میانگین بازدید روزانه 0.1879 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.299 بازدید
0 رأی
0 جواب میانگین بازدید روزانه 0.12111 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.25312 بازدید
+2 رأی
1 جواب میانگین بازدید روزانه 0.29443 بازدید
سوال 4 سال قبل در تالار برنامه نویسی توسط Milad (1,283 امتیاز)
+1 رأی
2 جواب میانگین بازدید روزانه 0.44663 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.09138 بازدید
کانال تلگرام جواب یاب
...