2015-01-13 2 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("?)"); 

      } 

     } .... 

код выдает происходит некорректно исключением какие-либо предложения, почему я получаю одновременное изменение и как избавиться от того же

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) 

Оставшийся код ниже

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 осущ // Исправленная

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

Если я что-то не хватает, информации здесь недостаточно, чтобы объяснить проблему. Вы получаете «ConcurrentModificationException», если вы меняете «Список», итерации по нему. Можете ли вы разместить больше кода? –

ответ

2

В getSubList создать несколько списков с помощью inputList.subList. Этот метод от List, реализованный в ArrayList, не создает новый список. Вместо этого он возвращает вид inputList и поэтому поддерживается inputList.

Любая модификация inputList оказывает влияние на подсписку. Вы прошли missedMSRB в качестве inputList, поэтому любое изменение missedMSRB повлияет на subList

Таким образом, при вызове missedMSRB.remove внутри внешнего контура for, вы создаете ConcurrentModification для всех списков в subList. Когда вы затем проверить размер одного из этих списков в subList он бросает ConcurrentModificationException

Чтобы решить эту проблему, вы можете, например, создать новый список вместо того, чтобы использовать непосредственно результат subList:

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

Спасибо, что проблема решена. Обновлен getSubList impl. :) – SHinny

Смежные вопросы