背景:Javaコードは、apcheとguavaのツールを使用して実行されるバッチと分割リストに分割されます(このツールを使用する特定の方法については、リンクを参照してください:https://blog.csdn.net/Mint6/article / details / 102875247)セグメンテーション後にforeachプロセスでremoveを呼び出すと、エラーjava.util.NoSuchElementExceptionが報告されます。
理由:apacheとguavaがリストを分割し、どちらもfalse split subLis tを使用します。リストは元のリストのままですが、渡されたサイズに応じて、各サブセクションは新しいリスト参照によって示されます。次の図に示すように、小さなリストは新しいオブジェクトを生成しないため、小さなリストを変更しても、リスト全体のコンテンツは変更されます。
エラーケースのデモ
public class PartialListRemoveError {
public static void main(String[] args) {
List<Integer> intList1 = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> subs1 = Lists.partition(intList1, 3);
for (List<Integer> list : subs1) {
list.clear();
System.out.println("输出总list" + intList1);
}
}
}
コード実行結果:
输出总list[4, 5, 6, 7, 8]
输出总list[4, 5, 6]
Exception in thread "main" java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java:364)
at formal.util.list.PartialListRemoveError.main(PartialListRemoveError.java:17)
概要:各スモールリスト参照は引き続き方向の全体リストであるため、スモールリストのコンテンツが削除されると、リスト全体のコンテンツが削除されます。これは、foreach中にリストを削除できないという問題に変換されます(この問題については、別の記事を参照してください:1。エラーのデモンストレーション:https ://blog.csdn.net/Mint6/article/details/81047349 2.エラー分析:https ://blog.csdn.net/mint6/article/details/77684609)
解決策:内部の小さなリストの新しい使用法を生成します。