2016-10-15 13 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>(); 

。どうしたの?

EDIT:コンソールログ:

[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 

はEDIT 2:まあ、私は私がBukkit /スピゴット(Minecraftのサーバー& API)でこのプロジェクトを構築しています、それは言って価値があると思います..しかし、私はそれがこのエラーの原因だとは思わない?

+0

コンソールログを表示してください。 –

+0

これを追加しました。ここにエラーログを貼り付けるだけでペーストビンを使用しなければならなかった。 – 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とArrayListの

のドキュメント

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

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

を確認し、次のコードを確認してください。例については

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

そのコメントをまだ送っていない、ごめんなさい..とにかく、私はそれを試みましたが、それはもちろん動作しますが、それは通常のIteratorでも働いています。 – jetp250

関連する問題