Exception in thread "main" java.util.ConcurrentModificationException

| ไอที | Java | 1590

Exception in thread "main" java.util.ConcurrentModificationException

บทความนี้เรามาดู Exception ที่เกิดขึ้นจากการรันโปรแกรมกันครับ ซึ่ง Exception นี้คือ ConcurrentModificationException ซึ่ง Exception นี้จะมีลักษณะข้อความคล้าย ๆ แบบนี้
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at com.doesystem.CodeFromDoesystem.main(CodeFromDoesystem.java:15)


จากข้อความ Exception ข้างบนเราสามารถแปลข้อความบางส่วนได้ ดังนี้
Exception เกิด Exception
thread "main" ก็คือ thread ที่ชื่อว่า main
ConcurrentModificationException อาจจะแยกได้ดังนี้ Concurrent คือ เกิดขึ้นพร้อมกัน Modification การปรับเปลี่ยน

ถ้านำมารวม ๆ กันแล้วอาจจะได้ว่า เกิด Exception ที่ thread main เป็น Exception ชนิด ConcurrentModificationException แล้วก็เกิดที่ Class ArrayList ซึ่งเป็นการเปลี่ยนแปลงแก้ไขข้อมูลพร้อมกันขณะที่อ่านข้อมูล

เมื่อเรามาดูโค้ดที่ทำให้เกิด Exception กันตามด้านล่าง
package com.doesystem;

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

public class CodeFromDoesystem {
	public static void main(String[] args) throws Exception {
		List<String> testList = new ArrayList<String>() {
			{
				add("a");
				add("b");
				add("c");
			}
		};
		for (String str : testList) {
			System.out.println(str);
			testList.add("d");
		}
	}
}


จาก Exception และโค้ด เราเห็นจุดที่ทำให้เกิด Exception แล้ว จาก Exception มันบอกว่าอยู่บรรทัดที่ 15 เราก็ไปดูที่บรรทัดที่ 15 เป็นการวนลูปเพื่อนำข้อมูลของ List ออกมา แล้วลองไล่ลงมาดูอีกสองบรรทัดเป็นการ add ข้อมูลลงใน List

ตัวอย่างวิธีการแก้ไข

ตัวอย่างการแก้ไขตัวอย่างแรก ให้เราวนลูปค่าออกมาให้หมดก่อนแล้วค่อยแก้ไข หรือแก้ไขก่อน แล้วค่อยวนลูปดังตัวอย่าง
package com.doesystem;

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

public class CodeFromDoesystem {
	public static void main(String[] args) throws Exception {
		List<String> testList = new ArrayList<String>() {
			{
				add("a");
				add("b");
				add("c");
			}
		};
		for (String str : testList) {
			System.out.println(str);
			//testList.add("d");
		}
		testList.add("d");
	}
}


ตัวอย่างการแก้ไขตัวอย่างที่สอง ให้เราเปลี่ยน List มาเป็น CopyOnWriteArrayList ดังตัวอย่าง
package com.doesystem;

import java.util.concurrent.CopyOnWriteArrayList;

public class CodeFromDoesystem {
	public static void main(String[] args) throws Exception {
		CopyOnWriteArrayList<String> testList = new CopyOnWriteArrayList<String>() {
			{
				add("a");
				add("b");
				add("c");
			}
		};
		for (String str : testList) {
			System.out.println(str);
			testList.add("d");
		}
	}
}


comments