我需要做这样的事......
Collection<T> myCollection; ///assume it is initialized and filled
for(Iterator<?> index = myCollection.iterator(); index.hasNext();)
{
Object item = index.next();
myCollection.remove(item);
}
Run Code Online (Sandbox Code Playgroud)
显然这会引发ConcurrentModificationException ...
所以我尝试了这个但是看起来并不优雅/高效并且抛出了Type安全:从Object到T的未经检查的强制转换警告
Object[] list = myCollection.toArray();
for(int index = list.length - 1; index >= 0; index--) {
myCollection.remove((T)list[index]);
}
Run Code Online (Sandbox Code Playgroud) 我运行一个服务器,它有一个处理计时系统的事件处理程序当我连续运行其中 3 个时,它给出了这个异常
Exception in thread "Thread-8" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at EventManager.run(EventManager.java:77)
at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)
这是问题的来源方法:
EventManager.getSingleton().addEvent( new Event() {
public void execute(EventContainer c) {
p.createProjectile(p.absY, p.absX, offsetY, offsetX, 1166, 43, 31, 70, p2.playerId);
c.stop(); // stops the event from running
}
}, 950); // in ms (1 second = 1000 ms)
EventManager.getSingleton().addEvent( new Event() {
public void execute(EventContainer c) {
p2.applyDAMAGE(misc.random(25));
c.stop(); // stops the event from running
}
}, 1300); // in ms (1 second = 1000 …Run Code Online (Sandbox Code Playgroud) 我得到了一个ConcurrentModificationException,尽管我使整个程序的所有方法都同步(包括静态方法和main方法).
我没有隐藏的迭代器.
我有一个正常的数据库调用,从我的数据库收集信息.我使用这些信息来创建我的对象(CallQueue)然后将这些对象添加到列表中,然后返回列表.
突然间我发现我原来的代码没有按预期工作,因为我创建了dublicates,所以现在我试图取消任何dublicates被创建!但有个问题!
我无法遍历我的列表并检查是否已创建对象!
这是我的代码:
while (query.next()) {
if (!queues.isEmpty()) {
/*This gives the Execption->*/
for (CallQueue callQueue : queues) {
if (callQueue.getType().equals(query.getString("KØ"))) {
double decimalTime = query.getDouble("TID");
int hourOfDay = (int)Math.round(24 * decimalTime);
int callAmount = query.getInteger("ANTAL_KALD");
if (hourOfDay > 19) {
hourOfDay = 19;
}
callQueue.addCallsByTime(hourOfDay, callAmount);
} else {
String queueName = query.getString("Kø");
if (!queueName.equalsIgnoreCase("PrivatOverflow")) {
CallQueue cq = new CallQueue(query.getString("KØ"));
double decimalTime = query.getDouble("TID");
int hourOfDay = (int)Math.round(24 * decimalTime);
int callAmount = query.getInteger("ANTAL_KALD");
if …Run Code Online (Sandbox Code Playgroud) 我有以下代码块:
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = list1;
// both list1 and list2 are empty arraylists
System.out.println(list1.size()); // prints: 0
list2.add(7);
System.out.println(list1.size()); // prints: 1
Run Code Online (Sandbox Code Playgroud)
为什么我修改list2时,list1也被修改了?这导致ConcurrentModificationException了我的程序.如何在不更改list1的情况下编辑list2?
我正在制作一个基于太空入侵者的2D java游戏.在我的Game类中,我有以下3个字段:
//enemies left to kill
private LinkedList<Enemy> enemiesLeft = new LinkedList<Enemy>();
//enemies killed
private LinkedList<Enemy> enemiesKilled = new LinkedList<Enemy>();
//missiles that have been fired
private LinkedList<Missile> missiles = new LinkedList<Missile>();
Run Code Online (Sandbox Code Playgroud)
在我的checkCollision()方法,我通过每个运行Enemy的enemiesLeft列表,并检查每次碰撞Missile的missiles列表,但它抛出一个ConcurrentModificationException.
这是checkCollision()方法:
private void checkCollisions(){
//make an iterator over enemies
ListIterator<Enemy> iterEnemies = enemiesLeft.listIterator();
//loop through enemies
while(iterEnemies.hasNext()){
//error is thrown at below line
Enemy e = iterEnemies.next(); //current Enemy
//go through each Missile
ListIterator<Missile> …Run Code Online (Sandbox Code Playgroud) 我是路过Arraylist的ParseObject,然后我把一个一个foreach循环,提取符合条件的项目时,用户对象不等于空.我面临两个问题.1.如果我通过将不同的数据传递到另一个列表然后在我的适配器中传递该列表来执行以下代码行,我将获得带有数字的随机数据,例如:如果在项目#1上,名称是"MAC",那么它在第3项中显示.
ArrayList<ParseObject> checkRequestedNetArrayList = new ArrayList<ParseObject>();
requestedNetArrayList = (ArrayList<ParseObject>) objects;
MyResponsibilitesActivity.requestedNetArrayList = requestedNetArrayList;
adapterRequest = new GenericAdapter<ParseObject>(
getApplicationContext(),
requestedNetArrayList,
R.layout.requested_trust_net_list_item,
requestedDataBinder);
requestListView.setAdapter(adapterRequest);
requestedNetArrayList = (ArrayList<ParseObject>) objects;
for(ParseObject object: objects){
System.out.println(object);
object.getParseObject("user");
if(object.has("user")){
checkRequestedNetArrayList.add(object);
}else{
checkRequestedNetArrayList.remove(object);
}
}
adapterRequest = new GenericAdapter<ParseObject>(
getApplicationContext(),
checkRequestedNetArrayList,
R.layout.requested_trust_net_list_item,
requestedDataBinder);
requestListView.setAdapter(adapterRequest);
Run Code Online (Sandbox Code Playgroud)
如果我正在执行以下代码行直接给出相同列表中的项目,我得到了 java.util.ConcurrentModificationException
for(ParseObject object: objects){
if(object.has("user")){
requestedNetArrayList.add(object);
}
}
else{
requestedNetArrayList.remove(object);
}
adapterRequest = new GenericAdapter<ParseObject>(
getApplicationContext(),
requestedNetArrayList,
R.layout.requested_trust_net_list_item,
requestedDataBinder);
requestListView.setAdapter(adapterRequest);
Run Code Online (Sandbox Code Playgroud)
}
请帮帮我.
请考虑以下代码:
if(!unmatchedNewTruckRequirementSet.isEmpty()){
for(Iterator<TruckRequirement> iterator = unmatchedNewTruckRequirementSet.iterator(); iterator.hasNext();){
TruckRequirement newTruckRequirement = iterator.next();
for(Iterator<TruckRequirement> iterator1 = oldTruckRequirementSet.iterator(); iterator1.hasNext();){
TruckRequirement oldTruckRequirement1 = iterator1.next();
if(oldTruckRequirement1.getTruckClassName().equals(newTruckRequirement.getTruckClassName())) {
LogUtil.logInfo("Truck Requirement Changed ", "Truck Requirement Changed : From : {0} to {1} where Truck Class is: {2}",
new Object[]{oldTruckRequirement1.getNumberOfTrucks(), newTruckRequirement.getNumberOfTrucks(), newTruckRequirement.getTruckClassName()});
unmatchedNewTruckRequirementSet.remove(newTruckRequirement);
}
}LogUtil.logInfo("Truck Requirement Added ", "New Truck Requirement Added with Truck Class : {0} and number of Trucks : {1}",
new Object[]{newTruckRequirement.getTruckClassName(), newTruckRequirement.getNumberOfTrucks()});
}else {
if(oldTruckRequirementSet.size() > unmatchedNewTruckRequirementSet.size()){
for(TruckRequirement truckRequirement : oldTruckRequirementSet) {
LogUtil.logInfo("Truck Requirement …Run Code Online (Sandbox Code Playgroud) 我正在spring-batch应用程序的ItemProcessor中遍历一个列表,但出现此错误:
java.util.ConcurrentModificationException: null
Run Code Online (Sandbox Code Playgroud)
当我将批处理配置设置为使用单个线程时,它可以正常工作。我正在使用SimpleAsyncTaskExecutor。客户是一个实体,并且具有客户别名列表。
private void fillCustomer(final Customer customer, final ExtractLine result){
CustomerAlias customerAlias = customer.getCustomerAlias().stream().filter(s -> s.getAliasType().isAster()).findFirst().orElse(nullAlias);
result.setCustomer(customerAlias.getCalNmeAliasName());
}
java.util.ConcurrentModificationException: null
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at org.hibernate.collection.internal.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:815)
at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1812)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at com.liq.sub.impl.MyProcessor.fillCustomer(MyProcessor.java:107)
Run Code Online (Sandbox Code Playgroud) 几乎每次调用时,下面的代码都会引发ConcurrentModificationException.第二段代码不会抛出异常,但它不是我需要的正确逻辑.如果对象是一个实例EditorFrame,我需要调用一个自定义处理策略,这就是close()方法.但是,如果它只是一个我希望它调用的基本帧dispose().
我环顾了这个网站并遵循了一些指示,但我找不到任何指示.
抛出异常的代码:
synchronized (frameList) {
for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) {
JFrame frame = it.next();
if (frame instanceof EditorFrame) ((EditorFrame) frame).close();
else frame.dispose();
it.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码有效,但这不是我想要的:
synchronized (frameList) {
for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) {
JFrame frame = it.next();
frame.dispose();
it.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我有以下代码抛出ConcurrentModificationException,因为我在同一个列表中使用两个不同的迭代器,其中一个正在修改列表.因此,第二个迭代器在读取列表时抛出异常,因为其他迭代器已经修改了列表.
List<Integer> list = new ArrayList<>();
populate(list);//A method that adds integers to list
ListIterator<Integer> iterator1 = list.listIterator();
ListIterator<Integer> iterator2 = list.listIterator();
while (iterator1.hasNext()) {
if(iterator1.next() < 5)
iterator1.remove();
}
while (iterator2.hasNext()){
if(iterator2.next() < 5) {
//Call handler
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果它还没有到达一个尚未被删除的元素,那么内部如何iterator2知道has已被其他迭代器修改过?怎么弄清楚其他一些人已经改变了?一种方法可能是跟踪大小,但这不是原因,因为其他迭代器可以只替换任何元素.listiterator1iteratorlist
java collections exception concurrentmodification listiterator
我读到,ConcurrentModificationException只要一个线程对某个列表执行结构修改,而另一个线程正在迭代其元素,则可以抛出 a 。为了检测此类修改,类的实例将List它们被修改的次数存储在名为 的字段中modCount,在列表的每次迭代时检查该字段的值以检查后者是否被修改。如果我的理解是正确的,则需要同步访问,因为如果在检查最后一次迭代中的值之后和循环结束之前modCount要修改所涉及的列表,则迭代器将无法检测到该列表是modCount在最后一次迭代期间进行了修改。
我有以下代码:
public static void main(String[] args) {
List<String> input = new ArrayList<>();
List<String> output = new ArrayList<>();
for(int i=0; i< 1000 ;i++){
input.add(i+"");
}
for(int i=0 ; i<input.size(); i++){
String value = input.get(i);
if(Integer.parseInt(value) % 2 == 0){
output.add(value);
input.remove(value);
}
}
input.stream().forEach(System.out::println);
System.out.println("--------------------------------------");
output.stream().forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)
我预计它会抛出,ConcurrentModificationException但它工作正常。有人可以解释一下原因吗?
java ×13
collections ×2
concurrency ×2
exception ×2
iteration ×2
list ×2
loops ×2
android ×1
arraylist ×1
iterator ×1
linked-list ×1
listiterator ×1
spring-batch ×1
stream ×1