2013-04-23 20 views
1

此方法返回使用卡宴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); 

隨後環路正常工作。我只是不明白爲什麼我沒有在第一個例子中得到一個錯誤或例外。更奇怪的是,爲什麼每個測試循環的結果都不一樣。

回答

0

我只是看着我的舊問題,看到這個問題仍然沒有答案。

刪除員工在Cayenne中觸發了一個回叫,並將員工重新添加到列表中。

0

Java for-each循環並非設計用於操縱正在迭代的List。您需要訪問Iterator才能刪除當前元素。該for-each循環隱藏了迭代器,這樣你就不能調用remove()

因此,您所選擇的方法,這就是唯一的方法(用for-each)。

你可以閱讀更多關於它here

+0

我意識到我不應該從列表中刪除,而是通過它迭代,這就是爲什麼我改變了代碼後刪除。但我沒有得到這樣的例外: [link] http://stackoverflow.com/questions/5113016/getting-a-concurrentmodificationexception-thrown-when-removing-an-element-from-a [/ link ] – Tuan 2013-04-24 04:23:32