ConcurrentModificationException for ArrayList
次のコードを考えてみましょう:
private String toString(List<DrugStrength> aDrugStrengthList) { StringBuilder str = new StringBuilder(); for (DrugStrength aDrugStrength : aDrugStrengthList) { if (!aDrugStrength.isValidDrugDescription()) { aDrugStrengthList.remove(aDrugStrength); } } str.append(aDrugStrengthList); if (str.indexOf("]") != -1) { str.insert(str.lastIndexOf("]"), "\n " ); } return str.toString(); }
このコードを実行すると、ConcurrentModificationException がトリガーされます。この例外は、for each ループを使用して ArrayList を反復処理する際に ArrayList を変更することが安全でないために発生します。
この問題を解決するには、for each ループを反復子ループに置き換えます。
for (Iterator<DrugStrength> it = aDrugStrengthList.iterator(); it.hasNext(); ) { DrugStrength aDrugStrength = it.next(); if (!aDrugStrength.isValidDrugDescription()) { it.remove(); } }
An iterator は、ArrayList を反復処理する際に ArrayList から要素を削除する安全な方法を提供します。リスト内の現在位置を追跡するカーソルを維持し、要素の削除が反復プロセスに影響を与えないようにします。
以上がFor-Each ループ中に ArrayList を変更すると ConcurrentModificationException が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。