apacheおよびguavaツールクラスのパーティションメソッドのバッチリストで簡単に発生する問題

背景: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

解決策:内部の小さなリストの新しい使用法を生成します。

 

おすすめ

転載: blog.csdn.net/Mint6/article/details/102875278