2016-10-15 2 views
0

this 아마도 내 경우와 가장 비슷하지만 도움이되지 않습니다.반복에서 이상한 ConcurrentModificationException이 발생했습니다.

나는 여기에 ConcurrentModificationException를 받고 있어요 :

for (Iterator<ProjectileBase> iterator = projectiles.iterator(); iterator.hasNext();) { 
     ProjectileBase proj = iterator.next(); < here 
     if (proj == null || !proj.isValid()) { 
      iterator.remove(); 
      continue; 
     } 
     if (((!proj.ignoreRange()) ? proj.lived <= proj.data.getRange() : true)){ 
      proj.lived++; 
      proj.onTick(); 
     } else { 
      MissileHitEvent event = new MissileHitEvent(proj.shooter, proj.wand, proj, false, null); 
      Bukkit.getPluginManager().callEvent(event); 
      if (!event.isCancelled()) { 
       iterator.remove(); 
       continue; 
      } else { 
       proj.lived = 0; 
      } 
     } 
    } 

here 을 제안 내가 한 비록?

목록은 다음과 같이 지정됩니다 클래스 건설에 intialized됩니다

private List<ProjectileBase> projectiles = new ArrayList<ProjectileBase>(); 

. 뭐가 문제 야?

편집 : 콘솔 로그 :

[10:01:58] [Craft Scheduler Thread - 3754/WARN]: Exception in thread "Craft Scheduler Thread - 3754" 
[10:01:58] [Craft Scheduler Thread - 3754/WARN]: org.apache.commons.lang.UnhandledException: Plugin MagicWands v1.0 generated an exception while executing task 247 
    at org.bukkit.craftbukkit.v1_9_R2.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57) 
    at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.util.ConcurrentModificationException 
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source) 
    at java.util.ArrayList$Itr.next(Unknown Source) 
    at io.jettymc.DataHolders.ProjectileManager.iterate(ProjectileManager.java:117) 
    at io.jettymc.DataHolders.ProjectileManager$1.run(ProjectileManager.java:232) 
    at org.bukkit.craftbukkit.v1_9_R2.scheduler.CraftTask.run(CraftTask.java:58) 
    at org.bukkit.craftbukkit.v1_9_R2.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53) 
    ... 4 more 

편집 2 : 글쎄, 난 ..이/스피 (마인 크래프트 서버 & API), 나는 Bukkit에이 프로젝트를 짓고 있어요 말하는 가치가 생각하지만, 이 오류의 원인인지 의심 스럽습니까?

+0

콘솔 로그를 표시하십시오. –

+0

추가했습니다. 여기에 오류 로그를 붙여 넣기 만하면 pastebin을 사용해야했습니다. – jetp250

+0

여기서 오류 로그가 제대로 작동합니다. 질문이 자동으로 업데이트되었습니다. – Andreas

답변

1

문제의 범위를 좁히는 데 도움이되는 트릭이 있습니다.

ArrayList에 대한 참조가 projectiles이라고 가정하면 반복하는 동안 임시로 불변의 목록으로 바꿀 수 있으므로 Iterator 만 목록을 수정할 수 있습니다. 다른 일부 코드가 목록을 수정하려고하면 예외 처리가 발생합니다. 오류 처리가 엉망이 아닌 것으로 가정하면 예외가 발생합니다.

예 :

List<ProjectileBase> projectilesHold = projectiles; 
projectiles = Collections.unmodifiableList(projectiles); 
try { 
    for (Iterator<ProjectileBase> iterator = projectilesHold.iterator(); iterator.hasNext();) { 
     // other code here is unchanged 
    } 
} finally { 
    projectiles = projectilesHold; 
} 

코드는 "보유"변수의 수정 목록을 저장 한 다음를 수정할 수 있도록 목록을 래핑합니다. finally 블록을 사용하면 수정 가능 목록이 무엇이든 복원됩니다. 그 remove() 방법은 작동 있도록

for 루프 반복자

는 "보유"의 수정 목록을 사용하도록 수정했지만, 다른 곳 projectiles 필드는 이제 반복의 기간 동안 변경 불가능한 것입니다.

이것은 디버그 전용입니다. . 제점을 식별하고 정정 한 후 논리를 다시 제거하십시오.

0

확인 해, ConcurrentModificationException의 문서와

https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

ArrayList에 당신의 문제는 다음 코드를 확인하십시오 해결하려면. 예를 들어

,

import java.util.*; 

public class HelloWorld{ 

    public static void main(String []args){ 
     List<String> animals = new ArrayList<>(); 
     animals.add("Cat1"); 
     animals.add("Cat2"); 
     animals.add("Cat3"); 
     animals.add("Cat4"); 
     animals.add("Cat5"); 

     for(ListIterator<String> iterator = animals.listIterator(); iterator.hasNext();) { 
      String name = iterator.next(); 
      if (name.equals("Cat2")) { 
       iterator.remove(); 
       continue; 
      } 
      System.out.println(name); 
     } 
    } 
} 

건배!

+0

Iterator를 ListIterator로 바꿨을뿐입니다. – jetp250

+0

미안하지만 아직 그 의견을 보내려하지 않았다. 어쨌든, 나는 그것을 시도하고 물론 작동하지만, 그것은 또한 정상적인 반복기와 함께, 오류가 없다는 것을 의미합니다. – jetp250

관련 문제