2015-01-13 43 views
0

missedMSRB是在它2187元和列表試圖運行下面的代碼片段此代碼塊的併發修改異常,請幫忙嗎?

List<List<String>> subList = getSubList(missedMSRB, 1000); 

    for (List<String> subMSRB : subList) { 

     StringBuffer sql = new StringBuffer(NamedQueries.msSQL); 
     sql.append("("); 

     for (int i1 = 0; i1 < subMSRB.size(); i1++) { //Line 463 Throws Exception 

      if (i1 < subMSRB.size() - 1) { 
       sql.append("?,"); 
      } else { 
       sql.append("?)"); 

      } 

     } .... 

代碼失敗與follwoing例外,爲什麼我收到併發修改,以及如何有任何建議擺脫同

時下面

PreparedStatement psMSQL2 = msSQL.prepareStatement(sql.toString()); 

    psMSQL2.setString(1, runDate); 
    psMSQL2.setString(2, runDate2); 

    int i = 3; 
    for (String s : subMSRB) { 
     psMSQL2.setString(i, s.trim()); 
     i++; 
    } 

    ResultSet msSQL = psMSQL2.executeQuery(); 
    logger.debug("SQL executed"); 

    while (msSQL.next()) { 
     missedMSRB.remove(msSQL.getString(1)); 
    } 

getSubList IMPL

13 Jan 2015 10:42:58,974 [main] ERROR RunAnalytics: General Error: null 
java.util.ConcurrentModificationException 
    at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1169) 
    at java.util.ArrayList$SubList.size(ArrayList.java:998) 
    at com.abc.Analytics.RunAnalytics.getCountCheck(RunAnalytics.java:463) 
    at com.abc.Analytics.RunAnalytics.analyticsExecute(RunAnalytics.java:342) 
    at com.abc.Analytics.RunAnalytics.main(RunAnalytics.java:84) 

剩餘代碼// 更正

public static List<List<String>> getSubList(List<String> inputList, int subListSize) { 

     int listSize = inputList.size(); 
     int noOfLoops = listSize/subListSize; 
     int remainingListSize = listSize % subListSize; 

     List<List<String>> subList = new ArrayList<List<String>>(); 

     for (int i = 0; i < noOfLoops; i++) { 
      int fromIndex = i * subListSize; 
      int toIndex = (fromIndex) + subListSize; 
      subList.add(new ArrayList<String>(inputList.subList(fromIndex, toIndex))); 

      if ((remainingListSize != 0) 
        && (toIndex == (listSize - remainingListSize))) { 
       subList.add(new ArrayList<String>(inputList.subList(toIndex, listSize))); 

      } 
     } 

     return subList; 

    } 
+0

任何其他線程修改列表? – njzk2

+0

是別的什麼修改'subMSRB'? (根據你的示例代碼沒有顯示) – gtgaxiola

+1

除非我錯過了一些東西,沒有足夠的信息來解釋這個問題。如果在迭代時更改List,則會出現ConcurrentModificationException異常。你能發佈更多的代碼嗎? –

回答

2

getSubList創建使用inputList.subList幾個列表。在ArrayList中執行的List中的此方法不會創建新的列表。相反,它返回inputList的視圖,因此支持inputList

inputList的任何修改都會對子列表產生影響。您已通過作爲inputListmissedMSRB,所以任何修改missedMSRB將在subList

影響。因此,當你在外for循環中調用missedMSRB.remove,您在subList創建ConcurrentModification所有列表。當您再檢查這個列表中的一個的大小subList它拋出ConcurrentModificationException

爲了解決這個問題,比如,你可以創建一個新的列表,而不是直接使用的subList結果:

subList.add(new ArrayList<String>(inputList.subList(fromIndex, toIndex))); 
+0

感謝問題解決了。更新了getSubList impl。 :) – SHinny