こんにちは、管理人の@Salesforce.Zです。
ループ処理ってコーディング時にごく普通なステートメントであり、重要です。
そして、ペテンの方がループ処理って簡単やんと思うかもしれませんが
今回、ループ処理時に遭遇したエラーの解消方法を共有します。
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でも同じことが起きそうです。