gọi dòng của bạn là (logic) làm giống như:
for (K k : someMap.keySet()) {
if (!someList.contains(k)) {
someMap.remove(k);
}
}
Nếu bạn chạy này, bạn sẽ tìm thấy nó ném ConcurrentModificationException
, bởi vì nó được sửa đổi bản đồ cùng một lúc như bạn đang lặp lại nó. Nếu bạn có một cái nhìn tại docs, bạn sẽ nhận thấy những điều sau đây:
Lưu ý rằng ngoại lệ này không phải lúc nào cũng chỉ ra rằng một đối tượng đã được đồng thời sửa đổi bởi một chuỗi khác nhau. Nếu một luồng đơn phát ra một chuỗi các lời gọi phương thức vi phạm hợp đồng của một đối tượng, đối tượng có thể ném ngoại lệ này. Ví dụ, nếu một chủ đề sửa đổi một bộ sưu tập trực tiếp trong khi nó đang lặp qua bộ sưu tập với một trình lặp không nhanh, thì trình vòng lặp sẽ ném ngoại lệ này.
Đây là những gì bạn đang làm, việc triển khai bản đồ bạn đang sử dụng rõ ràng có trình lặp không nhanh, do đó ngoại lệ này đang bị ném.
Một thay thế có thể là để loại bỏ các mục bằng cách sử dụng iterator trực tiếp:
for (Iterator<K> ks = someMap.keySet().iterator(); ks.hasNext();) {
K next = ks.next();
if (!someList.contains(k)) {
ks.remove();
}
}
Tôi nghĩ đây là câu trả lời hay nhất, nhưng bạn có thể sửa nó để thêm giải pháp mà @Eran đã đề cập. Nó sẽ là 100% đáp ứng cho bất cứ ai có cùng một vấn đề trong tương lai. – jaskmar
@ MariuszJaskółka, câu trả lời Eran cũng ở đây và những người khác cũng có khả năng sẽ thấy nó. Đó là chính xác và tôi upvoted nó. Tôi có thể thêm một tham chiếu đến giải pháp của anh ấy. –