gpt4 book ai didi

java - 此代码块的并发修改异常,请帮忙?

转载 作者:行者123 更新时间:2023-12-02 05:04:23 25 4
gpt4 key购买 nike

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 impl//已更正

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;

}

最佳答案

getSubList中,您使用inputList.subList创建多个列表。 ArrayList 中实现的 List 中的此方法不会创建新的 List。相反,它返回 inputList 的 View ,因此由 inputList 支持。

inputList的任何修改都会对子列表产生影响。您已将 missedMSRB 作为 inputList 传入,因此对 missedMSRB 的任何修改都会影响 subList

因此,当您在外部 for 循环中调用 missedMSRB.remove 时,您会为 中的所有列表创建一个 ConcurrentModification子列表。然后,当您检查 subList 中此列表之一的大小时,它会抛出 ConcurrentModificationException

要解决此问题,您可以创建一个新列表,而不是直接使用 subList 的结果:

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

关于java - 此代码块的并发修改异常,请帮忙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27925960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com