2011年11月28日 星期一

Java的ConcurrentModifyicationException處理方法

Java的ConcurrentModifyicationException處理方法


1. 問題描述

程式跑到一半,出現java.util.ConcurrentModificationException是何問題?


2. 解決方案

此為因為Collection在執行迴圈時,逕行將此Collection的數據(資料)新增或移除,而導致程式執行到一半時,發生錯誤。

解決此問題為在執行迴圈時,嚴禁將此Collection中的數據(資料)新增或移除,而採用其他方式來達到程式所要的目的。底下Sample範例程式就因此問題而做出兩種解法供大家參考,第一將欲刪除的資料另外設定於Temp的Collection中,其二為採用Iterator的方式來設置。



3. Sample範例程式

案例簡述:

一個簡單的案例,在一個Collection中,要判斷所有的數據(資料),其中屬性字段(欄位)為activeYn,若為N者,必須移除於此Collection之外。

原始代碼(程式):




代碼(程式)於紅色方框邏輯中,符合此條件者,此數據(資料)會被移除於此Collection中,但是在For迴圈中直接remove,系統跑到此行時,會拋出錯誤型態為java.util.ConcurrentModificationException的錯誤。

修正方法一:

將代碼(程式)修正為採用Temp Collection方式,將所有Collection中的數據(資料),全部於迴圈中跑一次,若符合此條件者,將此數據(資料)加入於Temp Collection中,於迴圈跑完後,再執行後續的新刪作業。



修正方法二:

將代碼(程式)修正為採用Iterator的方式來處理,若發現有符合的數據(資料),直接採用Iterator的remove指令,即可將Collection中的數據移除。

沒有留言:

張貼留言