JavaリストUnsupportedOperationException
1. 概要
このクイックチュートリアルでは、ほとんどのList実装のAPIであるUnsupportedOperationExceptionを使用するときに発生する可能性のある一般的なExceptionについて説明します。
java.util.Listは、通常のarrayがサポートできるよりも多くの機能を備えています。 たとえば、組み込みのメソッド呼び出しが1つしかない場合、特定の要素が構造内にあるかどうかを確認できます。 これが通常、arrayをListまたはCollectionに変換する必要がある理由です。
コアJavaList実装(ArrayList)の概要については、to this articleを参照してください。
2. UnsupportedOperationException
このエラーが頻繁に発生するのは、java.util.Arrays:からasList()メソッドを使用する場合です。
public static List asList(T... a)
それは戻ります:
-
指定されたarrayのサイズの固定サイズList
-
元のarrayの要素と同じタイプの要素であり、Objectである必要があります
-
元の配列と同じ順序の要素 as
-
serializableであり、RandomAccessを実装するリスト
Tはvarargsであるため、配列またはアイテムをパラメータとして直接渡すことができ、メソッドは固定サイズの初期化されたリストを作成します。
List flowers = Arrays.asList("Ageratum", "Allium", "Poppy", "Catmint");
実際のarrayを渡すこともできます。
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List flowerList = Arrays.asList(flowers);
Since the returned List is a fixed-size List, we can’t add/remove elements。
さらに要素を追加しようとすると、UnsupportedOperationExceptionが発生します。
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List flowerList = Arrays.asList(flowers);
flowerList.add("Celosia");
このExceptionのルートは、返されたオブジェクトがjava.util.ArrayList.と同じではないため、add() 操作を実装しないことです。
java.util.Arrays.からのArrayListです
同じ例外を取得する別の方法は、取得したリストから要素を削除しようとすることです。
一方、必要な場合に備えて、変更可能なListを取得する方法があります。
それらの1つは、asList()の結果から直接ArrayListまたは任意の種類のリストを作成することです。
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List flowerList = new ArrayList<>(Arrays.asList(flowers));
3. 結論
結論として、リストに要素を追加すると、不変のリストだけでなく問題が発生する可能性があることを理解することが重要です。
いつものように、例の完全なソースコードはover on GitHubで入手できます。