+1 امتیاز
قبل در برنامه نویسی توسط (467 امتیاز)
ویرایش شده قبل توسط

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

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

1 پاسخ

+2 امتیاز
قبل توسط (693 امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ

اگر که جاواداک 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 پرتاب میشه

سوالات مشابه

+1 امتیاز
1 پاسخ 461 بازدید
+1 امتیاز
2 پاسخ 500 بازدید
0 امتیاز
1 پاسخ 848 بازدید
+1 امتیاز
1 پاسخ 570 بازدید
0 امتیاز
1 پاسخ 329 بازدید
0 امتیاز
1 پاسخ 404 بازدید
سوال شده 6 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
1 پاسخ 559 بازدید
...