投稿日:
2020年2月7日
最終更新日:
【コレクションオブジェクト】要素を操作した際にUnsupportedOperationExceptionが出る原因と対応方法【Java】
YouTubeも見てね♪
Anker PowerCor
旅行には必須の大容量モバイルバッテリー!
ペヤング ソースやきそば 120g×18個
とりあえず保存食として買っておけば間違いなし!
レッドブル エナジードリンク 250ml×24本
翼を授けよう!
モンスターエナジー 355ml×24本 [エナジードリンク]
脳を活性化させるにはこれ!
ドラゴンクエスト メタリックモンスターズギャラリー メタルキング
みんな大好き経験値の塊をデスクに常備しておこう!
Bauhutte ( バウヒュッテ ) 昇降式 L字デスク ブラック BHD-670H-BK
メインデスクの横に置くのにぴったりなおしゃれな可動式ラック!
サンディスク microSD 128GB
スマホからSwitchまで使える大容量MicroSDカード!
目次
java.lang.UnsupportedOperationException
概要
こちらは、List
やMap
などが固定長な形式な際にadd
やput
などをしようとすると発生します。
主に、Collections.emptyList()
やCollections.emptyList()
、Arrays.asList()
などで生成したコレクションオブジェクトにadd
やput
、remove
などの操作を加えようとすると発生します。
配列をリストに変換する際にArrays.asList
はよく使うと思うので、覚えておくと良いでしょう。
finalは関係ない
このエラーが発生した際によく間違えるのが、final
で定義した変数に対して操作をしているから、と勘違いしてしまう人も少なくありません。
final
による挙動は、一度代入した変数への再代入を防ぐ事になるので、一度代入した変数が持っているメソッドを使って中身を操作する分には問題ありません。
また、エラーのタイミングについても実行時エラーでなくビルドエラーになります。
1
2
3
4
5
6
7
8
9
10
11
12
|
package app;
import java.util.ArrayList;
import java.util.List;
public class App {
public static void main(String[] args) {
final List<String> arraysList = new ArrayList<>();
arraysList = new ArrayList<>();
arraysList.add("value");
}
}
|
1
2
3
4
|
App.java:13: error: cannot assign a value to final variable arraysList
arraysList = new ArrayList<>();
^
1 error
|
覚えておくと良いでしょう♪
サンプル
Map
とList
について簡単なサンプルをまとめてみました。
Map
Collections.emptyMap
1
2
3
4
5
6
7
8
9
10
11
|
package app;
import java.util.Collections;
import java.util.Map;
public class App {
public static void main(String[] args) {
Map<String, String> emptyMap = Collections.emptyMap();
emptyMap.put("a", "value");
}
}
|
1
2
3
|
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.AbstractMap.put(AbstractMap.java:209)
at app.App.main(App.java:9)
|
new HashMap
1
2
3
4
5
6
7
8
9
10
11
|
package app;
import java.util.HashMap;
import java.util.Map;
public class App {
public static void main(String[] args) {
Map<String, String> hashMap = new HashMap<String, String>();
hashMap.put("a", "value");
}
}
|
こちらは正常に処理が終了します。
List
Collections.emptyList
1
2
3
4
5
6
7
8
9
10
11
|
package app;
import java.util.Collections;
import java.util.List;
public class App {
public static void main(String[] args) {
List<String> emptyList = Collections.emptyList();
emptyList.add("value");
}
}
|
1
2
3
4
|
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList.add(AbstractList.java:111)
at app.App.main(App.java:9)
|
new ArrayList
1
2
3
4
5
6
7
8
9
10
11
|
package app;
import java.util.ArrayList;
import java.util.List;
public class App {
public static void main(String[] args) {
List<String> arrayList = new ArrayList<String>();
arrayList.add("value");
}
}
|
こちらは正常に処理が終了します。
Arrays.asList
1
2
3
4
5
6
7
8
9
10
11
|
package app;
import java.util.Arrays;
import java.util.List;
public class App {
public static void main(String[] args) {
List<String> asList = Arrays.asList();
asList.add("value");
}
}
|
1
2
3
4
|
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList.add(AbstractList.java:111)
at app.App.main(App.java:9)
|
Arrays.asListで変換したリストに操作を加えたい場合
Arrays.asList
を使って生成したリストに操作を加えたい場合は、以下のようにnew ArrayList
でラップすることで可能になるので覚えておくと良いでしょう♪
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package app;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class App {
public static void main(String[] args) {
List<String> asList = Arrays.asList();
List<String> arrayList = new ArrayList<String>(asList);
arrayList.add("value");
}
}
|
終わりに
以上のように、よく使うような記述ですがちょっと使い方を間違えるとバグを潜ませる事になってしまいます。
この辺の挙動の違いを覚えておくだけでも、エンジニアとしてのレベルが少し上がるので是非頭の片隅に置いておくと良いでしょう♪