ねこじゃすり
猫を魅了する魔法の装備品!
Anker PowerCor
旅行には必須の大容量モバイルバッテリー!
[ノースフェイス] THE NORTH FACE メンズ アウター マウンテンライトジャケット
防水暴風で耐久性抜群なので旅行で大活躍です!
ペヤング ソースやきそば 120g×18個
とりあえず保存食として買っておけば間違いなし!
レッドブル エナジードリンク 250ml×24本
翼を授けよう!
Bauhutte ( バウヒュッテ ) 昇降式 L字デスク ブラック BHD-670H-BK
メインデスクの横に置くのにぴったりなおしゃれな可動式ラック!
BANDAI SPIRITS ULTIMAGEAR 遊戯王 千年パズル 1/1スケール
もう一人の僕を呼び覚ませ!!
スポンサーリンク
目次
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"); } } |
終わりに
以上のように、よく使うような記述ですがちょっと使い方を間違えるとバグを潜ませる事になってしまいます。
この辺の挙動の違いを覚えておくだけでも、エンジニアとしてのレベルが少し上がるので是非頭の片隅に置いておくと良いでしょう♪