پرتاب نشدن ConcurrentModificationException

+1 رأی

در آموزش‌های جاوا کاپ (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

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

سوال 6 ماه قبل در تالار کامپیوتر و اینترنت توسط Sina Deuxshiri (414 امتیاز) 85% درصد پذیرش
ویرایش 6 ماه قبل توسط 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 پرتاب میشه

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

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

0 رأی
1 جواب 136 بازدید
0 رأی
1 جواب 60 بازدید
0 رأی
0 جواب 69 بازدید
+1 رأی
1 جواب 86 بازدید
0 رأی
0 جواب 105 بازدید
0 رأی
1 جواب 289 بازدید
+2 رأی
1 جواب 435 بازدید
سوال 3 سال قبل در تالار کامپیوتر و اینترنت توسط Milad (1,283 امتیاز)
+1 رأی
2 جواب 627 بازدید
+1 رأی
1 جواب 135 بازدید
...