「ClassCastException」について書かれた記事をいくつか読みましたが、その意味がよくわかりませんでした。ClassCastException とは何ですか?
12 に答える
のAPI仕様から直接ClassCastException
:
コードがオブジェクトをインスタンスではないサブクラスにキャストしようとしたことを示すためにスローされます。
したがって、たとえば、 anInteger
を aにキャストしようとするとString
、String
は のサブクラスではないInteger
ため、 aClassCastException
がスローされます。
Object i = Integer.valueOf(42);
String s = (String)i; // ClassCastException thrown here.
クラス A のオブジェクトをクラス B のオブジェクトに型キャストしようとしていて、互換性がない場合は、クラス キャスト例外が発生します。
クラスの集まりを考えてみましょう。
class A {...}
class B extends A {...}
class C extends A {...}
- すべての Java クラスは Object から継承されるため、これらはすべて Object にキャストできます。
- B または C のいずれかを A にキャストできます。どちらも A の「種類」だからです。
- 実際のオブジェクトがBである場合にのみ、A オブジェクトへの参照を B にキャストできます。
- 両方とも A であっても、B を C にキャストすることはできません。
これは、クラスをダウンキャストしようとした場合に発生する例外ですが、実際にはそのクラスはそのタイプではありません。
この階層について考えてみましょう。
オブジェクト->動物->犬
次のようなメソッドがあるかもしれません:
public void manipulate(Object o) {
Dog d = (Dog) o;
}
このコードで呼び出された場合:
Animal a = new Animal();
manipulate(a);
正常にコンパイルされますが、実行時にClassCastException
oが実際には犬ではなく動物であったため、取得されます。
それ以降のバージョンのJavaでは、次の場合を除いて、コンパイラの警告が表示されます。
Dog d;
if(o instanceof Dog) {
d = (Dog) o;
} else {
//what you need to do if not
}
キャスティングの概念を理解していますか?キャストは型変換のプロセスであり、Java は静的に型付けされた言語であるため、Java では非常に一般的です。いくつかの例:
"1"
文字列をint
, viaにキャストInteger.parseInt("1")
-> 問題ありません
"abc"
文字列を an にキャストint
-> a を発生させますClassCastException
Animal.class
または、 、Dog.class
およびを含むクラス図を考えてください。Cat.class
Animal a = new Dog();
Dog d = (Dog) a; // No problem, the type animal can be casted to a dog, because it's a dog.
Cat c = (Dog) a; // Will cause a compiler error for type mismatch; you can't cast a dog to a cat.
あるデータ型のオブジェクトを別のデータ型にキャストしようとすると、Java によってクラス キャスト例外がスローされます。
Java では、互換性のあるデータ型間でキャストが行われる限り、ある型の変数を別の型にキャストできます。
たとえば、String を Object としてキャストできます。同様に、String 値を含む Object を String にキャストできます。
例
多数の ArrayList オブジェクトを保持する HashMap があると仮定しましょう。
次のようなコードを書くと:
String obj = (String) hmp.get(key);
ハッシュ マップの get メソッドによって返される値は配列リストになるため、クラス キャスト例外がスローされますが、これを文字列にキャストしようとしています。これにより、例外が発生します。
オブジェクトを、そうではないクラスのインスタンスとして処理しようとしています。これは、ギターのダンパーペダルを踏もうとするのとほぼ同じです(ピアノにはダンパーペダルがありますが、ギターにはありません)。
Java での classcastException の非常に良い例は、「コレクション」を使用している場合です。
List list = new ArrayList();
list.add("Java");
list.add(new Integer(5));
for(Object obj:list) {
String str = (String)obj;
}
上記のコードにより、実行時に ClassCastException が発生します。Integer を String にキャストしようとしているため、例外がスローされます。
オブジェクトを並べ替えたいが、クラスが Comparable または Comparator を実装していない場合は、ClassCastException を取得します。たとえば
class Animal{
int age;
String type;
public Animal(int age, String type){
this.age = age;
this.type = type;
}
}
public class MainCls{
public static void main(String[] args){
Animal[] arr = {new Animal(2, "Her"), new Animal(3,"Car")};
Arrays.sort(arr);
}
}
上記のメイン メソッドは、ランタイム クラスの下のキャスト例外をスローします
スレッド「メイン」の例外 java.lang.ClassCastException: com.default.Animal は java.lang.Comparable にキャストできません