此方法返回使用卡宴SelectQuery僱員對象的列表現在意外的值,同時通過卡宴performQuery()循環導致
List<Employee> getEmployees() {
...
return getObjectContext().performQuery(query);
}
,我通過結果
List<Employee> employees = getEmployees();
// test loop 1
for (Employee employee : employees) {
//print out employee name
}
for (Employee employee : employees) {
//print out employee name
if (matchesSomeCondition) {
employees.remove(employee);
}
}
// test loop 2
for (Employee employee : employees) {
//print out employee name
}
在測試迴路循環1,它會顯示例如:
-John Smith
-Jane Doe
-Roger Wilco
在實際的刪除循環,它會省略我的人:
-John Smith
-Roger Wilco
然後在測試環2它會輸出大家:
-John Smith
-Jane Doe
-Roger Wilco
當我改變去除循環到:
List<Employee> badEmployees = new ArrayList<Employee>();
for (Employee employee : employees) {
//print out employee name
if (matchesSomeCondition) {
badEmployees.add(employee);
}
}
employee.removeAll(badEmployees);
隨後環路正常工作。我只是不明白爲什麼我沒有在第一個例子中得到一個錯誤或例外。更奇怪的是,爲什麼每個測試循環的結果都不一樣。
我意識到我不應該從列表中刪除,而是通過它迭代,這就是爲什麼我改變了代碼後刪除。但我沒有得到這樣的例外: [link] http://stackoverflow.com/questions/5113016/getting-a-concurrentmodificationexception-thrown-when-removing-an-element-from-a [/ link ] – Tuan 2013-04-24 04:23:32