JavaでUnsupportedOperationExceptionが発生する原因と回避方法を解説
UnsupportedOperationExceptionは、JavaにおけるRuntimeExceptionのサブクラスの一つで、要求された操作がサポートされていないことを示すためにスローされる例外です。この例外クラスはJava Collections Frameworkの一部であり、List、Queue、Set、Mapといった具象コレクションクラスのほとんどからスローされる可能性があります。
UnsupportedOperationExceptionの構文
public class UnsupportedOperationException extends RuntimeException
UnsupportedOperationExceptionが発生するコード例
import java.util.*;
public class UnsupportedOperationExceptionTest {
public static void main(String[] args) {
List aList = new ArrayList();
aList.add('a');
aList.add('b');
List newList = Collections.unmodifiableList(aList);
newList.add('c');
}
}
上記の例では、Collections.unmodifiableList()によって生成された「変更不可能なビュー」に対してadd()メソッドを呼び出しているため、UnsupportedOperationExceptionが発生します。
この例外を回避するためには、変更不可能なビューオブジェクトではなく、元のコレクションオブジェクトそのものに対して変更操作を行う必要があります。
実行結果(出力)
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
at UnsupportedOperationExceptionTest.main(UnsupportedOperationExceptionTest.java:9)
UnsupportedOperationExceptionが発生しやすい主な場面
この例外は、変更を許可しないコレクションに変更操作を加えたときによく発生します。代表的なケースは以下の通りです。
Arrays.asList()で生成した固定長リストへの要素の追加・削除List.of()やMap.of()などで生成したイミュータブル(不変)コレクションへの変更操作Collections.unmodifiableMap()やCollections.unmodifiableSet()などのラッパー経由でのコレクション変更
コレクションを外部に公開する際は意図的に変更不可能なビューを返すことが有効ですが、その場合は呼び出し側で変更操作を行わないよう設計段階で注意しましょう。
-
Windows 10・8・7でJavaをアンインストールする2つの方法【手動/ツール】
近年、Javaを日常的に利用するユーザーは少なくなりました。しかし、PCに残された古いバージョンのJavaは、システムにさまざまなセキュリティリスクをもたらすといわれています。一方で、NVIDIAグラフィックドライバーのインストールなど、一時的にJavaが必要になるケースもあります。 そのような用途が終わった後は、Windows 10からJavaを削除したいと考える方が多いのではないでしょうか。実際、多くのユーザーがWindowsやMacでJava 11やJava 8をアンインストールしたいと報告しています。どのバージョンを削除したい場合でも、以下の方法でJavaを完全かつ恒久的に取り除くこ
-
JavaでMySQLに接続する方法を解説!JDBC接続の基本コード
JavaとMySQLを接続するには? JavaアプリケーションからMySQLデータベースに接続するには、JDBC(Java Database Connectivity)を使用します。JDBCは、Javaからリレーショナルデータベースへアクセスするための標準APIであり、MySQL用のJDBCドライバ(Connector/J)をクラスパスに追加しておく必要があります。 以下は、Javaのコードを使ってMySQLに接続する基本的なサンプルです。 MySQL接続のサンプルコード import java.sql.Connection; import java.sql.DriverManager; p