JavaリストUnsupportedOperationException
1.概要
このクイックチュートリアルでは、ほとんどの
List
実装のAPI(
UnsupportedOperationException
)を扱うときに発生する可能性がある一般的な
Exception
について説明します。
java.util.List
は、通常のa
__rray
がサポートできる以上の機能を持っています。たとえば、1つの組み込みメソッド呼び出しだけで、特定の要素が構造体内にあるかどうかを確認することができます。通常、
array
を
List
または
Collection__に変換する必要があるのはそのためです。
コアとなるJavaの
List
実装 –
ArrayList
– の紹介については、link:/java-arraylistを参照してください。
2.
UnsupportedOperationException
このエラーが頻繁に発生する方法は、
java.util.Arraysの
asList()__メソッドを使用する場合です。
public static List asList(T... a)
それは戻ります:
-
** 与えられた
array
のサイズとしての固定サイズの
List
-
元の
array
の要素と同じ型の要素
Object
でなければなりません
元の配列と同じ順序の
要素
-
直列化可能なリスト
RandomAccess
を実装します。
Tはリンク:/java-varargs[
varargs
]なので、配列または項目をパラメータとして直接渡すことができ、メソッドは固定サイズの初期化リストを作成します。
List<String> flowers = Arrays.asList("Ageratum", "Allium", "Poppy", "Catmint");
実際の
array
を渡すこともできます。
String[]flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List<String> flowerList = Arrays.asList(flowers);
-
返される
List
は固定サイズの
List
なので、要素を追加/削除することはできません** 。
さらに要素を追加しようとすると、
UnsupportedOperationException
が発生します。
String[]flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List<String> flowerList = Arrays.asList(flowers);
flowerList.add("Celosia");
この
Exception
の根本は、返されるオブジェクトが
java.util.ArrayList.
と同じではないため、
__add()
__操作を実装していないことです
-
これは
java.util.Arraysの
ArrayList__です。
同じ例外を取得するもう1つの方法は、取得リストから要素を削除しようとすることです。
一方、必要に応じて可変の
List
を取得する方法があります。
そのうちの1つは、
asList()
の結果から
ArrayList
または任意の種類のリストを直接作成することです。
String[]flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List<String> flowerList = new ArrayList<>(Arrays.asList(flowers));
3.まとめ
結論として、リストに要素を追加すると、不変リストだけでなく問題が発生する可能性があることを理解することが重要です。
いつものように、例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-collections[GitHubで利用可能]です。