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));
}
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
中的此方法不创建新列表。相反,它返回inputlist
的视图,因此由inputlist
支持。
对inputlist
的任何修改都会对子列表产生影响。您已将missedmsrb
作为inputlist
传递,因此对missedmsrb
的任何修改都将影响sublist
因此,当您在外部for
循环中调用missedmsrb.remove
时,您将为sublist
中的所有列表创建一个concurrentmodifiation
。然后在sublist
中检查其中一个列表的大小时,它抛出ConcurrentModificationException
要解决此问题,例如,您可以创建一个新列表,而不是直接使用sublist
的结果:
subList.add(new ArrayList<String>(inputList.subList(fromIndex, toIndex)));
当我使用temp=iterator.next()时,sort方法会导致并发修改错误。你能帮我解决并发修改错误吗。我给出了整个类的代码,但我只是尝试完成sort方法。事先谢谢你的帮助。 我必须对ArrayList中的所有数组进行排序。
问题内容: 我有这段代码,它给了我并发修改异常。即使看不到任何并发修改,我也无法理解为什么继续得到它。 问题答案: 为了避免,你应该这样编写代码: 允许你在迭代期间修改列表,但不能在创建和使用列表之间进行修改。
我对java相当陌生,实际上我正在编写一个键盘记录器,并让它定期写入文件。每当用户按下某个键时,它都会实例化一个NativeKeyEvent,该事件调用“param string()”并将信息作为字符串添加到下面的arraylist中... 然后,在每一个间隔,字符串数组被传递,并被写入下面的TimerTask线程中的文件。 行'str=iterator.next().tostring();‘然后
问题内容: 您能否告诉我在单线程环境中是否有可能发生并发修改异常的方法,我下面发布的以下应用程序由两个线程组成,请告诉我我也可以在单个线程中看到相同的异常..请劝告 是的,我知道,在单线程环境中,此错误可能会出现..如下面的代码所示。 请告知解决该问题的方法是什么..这样就不会出现此错误.. !! 问题答案: 可以在单线程环境中引发A。只要在不应该在上下文中修改对象的情况下使用它,就不必在另一
当Maven构建我的项目并运行单元测试时,有时会抛出一个并发修改异常(大约5次中有1次会失败,其他时间会成功构建)。但是当我以单元测试的形式在本地运行测试时,它们都会毫无例外地通过。 在我的pom.xml文件我有Surefire插件配置为: 然而,我得到的stackTrace没有提到是什么导致了并发修改异常。 我注意到所有的测试都通过了构建,但是出于某种原因,Maven重新打印了已经通过但现在有测
下面我需要帮助:我有两种方法: 第二种方法 在for循环中的方法calculatime中,我只得到第一个项目的结果,然后得到与标题相同的错误。请帮帮我,为这个案子多解释一下。