HomeJavaClassCastExceptionと型の扱い

JavaにおけるClassCastExceptionが発生する原因についてと、簡単なJavaサンプルコードを掲載しています。

ClassCastExceptionとJavaの型の扱い

ClassCastExceptionについて

前章で取り上げた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トップへ

ページトップへ

トピックアップ メニュー

トピックアップ リンク

Copyright (C) トピックアップ All Rights Reserved.
inserted by FC2 system