例外のClassCastExceptionについて調べます。
ClassCastExceptionとは?
ClassCastExceptionは名前の通りクラスをキャストしようとした時の例外に対して発生します。
オブジェクトが継承関係にないサブクラスにキャストしようとした時や実現関係にないクラスにキャストしようとするとClassCastExceptionとなります。
ClassCastExceptionを発生させてみよう!
どんな時にClassCastExceptionが発生するのかみてみましょう。
サンプルコード
public class Sample {}
class Station{
void cast(Object obj) {
Station s = (Station) obj; //ここで例外が発生
}
}
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
Station eki = new Station();
eki.cast(s);
}
}
実行結果
Exception in thread “main” java.lang.ClassCastException
継承関係の無いクラスをキャストしようとしたため例外が発生しました。
回避策
instanceofを使ってキャスト可能か判定してから実行するようにすると例外を回避できます。
class Station{
void cast(Object obj) {
if (obj instanceof Station) {
Station s = (Station) obj;
}
}
}
サンプルコード
せっかくなのでもうひとつ例です。
public class Sample {}
public class SubSample extends Sample {}
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
SubSample sub = (SubSample) s; //ここで例外が発生
}
}
実行結果
Exception in thread “main” java.lang.ClassCastException
SubSampleはSampleを親に持つクラスですが、子から親の型へダウンキャストしようとしているためClassCastExceptionが発生しました。
回避策
こちらもinstanceofで確認しておけば例外は発生しません。
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
if(s instanceof SubSample){
SubSample sub = (SubSample) s;
}else{
System.out.println(“ClassCastExceptionになるよ”);
}
}
}
おわり
ClassCastExceptionはinstanceofを使えば回避できるので、instanceofを忘れなければ遭遇しなくてすむかもしれませんね。