JavaにおけるClassCastExceptionが発生する原因についてと、簡単なJavaサンプルコードを掲載しています。
前章で取り上げたNullPointerExceptionと同様に
Javaエンジニアであれば見たことがない人はいない、と言っても過言ではないのがClassCastExceptionでしょう。
ClassCastExceptionは2つ以上の異なる型を、ある一つの型に揃えようとして互換性がない場合に発生します。
具体例として、以下のJavaコードを取り上げてみます。
List testList = new ArrayList(); testList.add("123"); testList.add("topickup"); testList.add(new Timestamp(Calendar.getInstance().getTimeInMillis())); System.out.println((String)testList.get(0)); System.out.println((String)testList.get(1)); System.out.println((String)testList.get(2));
上記のJavaプログラムはコンパイルエラーにはなりませんが、実行すると
System.out.println((String)testList.get(2));
のところで、ClassCastExceptionが発生します。
String型として扱っていますが、互換性のないTimestamp型であることが原因です。
testListにaddする際に一時的に抽象的になったデータを、具体的な値として扱うよう変更する場合に
ClassCastExceptionが発生するリスクがあります。
JDK5以降からはGenericsの恩恵があるため、
上記のtestListに入る値の型をStringに明記してやることで
ClassCastExceptionの発生をコンパイルエラーで感知し、事前に防ぐことができます。
サンプル例として以下のJavaコードを記載します。
List<String> testList = new ArrayList<String>(); testList.add("123"); testList.add("topickup"); testList.add(new Timestamp(Calendar.getInstance().getTimeInMillis())); System.out.println((String)testList.get(0)); System.out.println((String)testList.get(1)); System.out.println((String)testList.get(2));
上記のように、testListのインスタンスを取得する際に、String型を指定してやると
testList.add(new Timestamp(Calendar.getInstance().getTimeInMillis()));
のところでコンパイルエラーとなります。
これで、eclipseを使っていればその恩恵を受けコンパイルエラーを目視確認することができ、
ClassCastExceptionを防ぎ、例外発生リスクを低減できます。
Javaトップへ