Memos About Salesforce

Salesforceにハマってたこと!

apex loop ループ操作 エラー:apex Cannot modify a collection while it is being iterated.

こんにちは、管理人の@Salesforce.Zです。

ループ処理ってコーディング時にごく普通なステートメントであり、重要です。

そして、ペテンの方がループ処理って簡単やんと思うかもしれませんが

今回、ループ処理時に遭遇したエラーの解消方法を共有します。

Cannot modify a collection while it is being iterated.

繰り返されている間にコレクションを変更できません

ループ処理では、リスト(文字列、数値、オブジェクト)をループしながら、変更することができない点が重要です。

f:id:jude2016:20190802152242j:plain
Cannot modify a collection while it is being iterated

読んだら得ること

★ 掲題のエラーの解消方法

目次

ループ

ごく普通なループ

for(String value :valueList){
    if(条件Aなら){
        //処理
    }
    if(条件Bなら){
        //処理
    }
}
for(sObject record :recordList){
    if(条件Aなら){
        //処理
    }
    if(条件Bなら){
        //処理
    }
}

エラーになるループ例

for(sObject record :recordList){
    if(条件Aなら){
        //recordListに対して、removeやaddなど、変更処理を加えると
        //Cannot modify a collection while it is being iterated.のエラーにある
    }
    if(条件Bなら){
        //処理
    }
}

for(String value :valueList){
    if(条件Aなら){
        //valueListに対して、removeやaddなど、変更処理を加えると
        //Cannot modify a collection while it is being iterated.のエラーにある
    }
    if(条件Bなら){
        //処理
    }
}

ループしながら、リストの変更処理をしてもエラーにならなら例

for(Integer index = 0; index < recordList.size(); index++){
    if(条件Aなら){
        //recordListに対して、removeやaddなど、変更処理を加えても
        //Cannot modify a collection while it is being iterated.のエラーになりません
    }
    if(条件Bなら){
        //処理
    }
}

for(Integer index = 0; index < valueList.size(); index++){
    if(条件Aなら){
        //valueListに対して、removeやaddなど、変更処理を加えても
        //Cannot modify a collection while it is being iterated.のエラーになりません
    }
    if(条件Bなら){
        //処理
    }
}

最後に

掲題のようにエラーメッセージにある「collection」はリスト自身でループする時に遭うもの

繰り返されている間にコレクションを変更できません

変数自身でループせずにリスト変更操作してOK

変数自身でループしながらリスト変更操作してダメ

結論は繰り返されている間にコレクションを変更できません。

変更とはaddのほかにも、コレクションにadd、clear、removeとか

ちなみに「Cannot modify a collection while it is being iterated.」はSetやMapでも同じことが起きそうです。