についての説明ClassCastException"Java
-
05-09-2019 - |
質問
みんな待っているんだから"と書かれた記事の"ClassCastException"に思う。あ又はその説明を受け?
解決
ストレート ClassCastException
のます:
1はのコードがあることを示すためにスローされます にオブジェクトをキャストしよう それがされていないのサブクラス インスタンスます。
Integer
にString
をキャストしようとすると、ですから、例えば、String
はInteger
のサブクラスではありませんので、ClassCastException
がスローされます。
Object i = Integer.valueOf(42);
String s = (String)i; // ClassCastException thrown here.
他のヒント
でのインターネットはモバイル:合しようとしている網のオブジェクトクラスへのオブジェクトのクラスB、な対応ができ、クラスのキャストします。
そう、考えようの集ます。
class A {...}
class B extends A {...}
class C extends A {...}
- でいずれもオブジェクトですべてのJavaクラスを継承からオブジェクトです。
- できるキャストからBまたはCをいたとも"種"の
- できるキャストへの参照オブジェクトB る場合のみ 実際のオブジェクトB
- できなキャスト、B、Cにもかかわらず両方です。
それはあなたのクラスをダウンキャストしようとすると発生する例外ですが、実際にはクラスはそのタイプではありません。
この階層構造を考えてみます:
オブジェクト - >動物 - >犬
あなたは、メソッドが呼び出されている場合があります:
public void manipulate(Object o) {
Dog d = (Dog) o;
}
このコードで呼び出された場合:
Animal a = new Animal();
manipulate(a);
これがうまくコンパイルされますが、oは実際には動物ではなく、犬だったので、実行時に、あなたがClassCastException
を取得します。
のJavaのそれ以降のバージョンであなたはあなたがいない限り、コンパイラ警告が表示されます実行します。
Dog d;
if(o instanceof Dog) {
d = (Dog) o;
} else {
//what you need to do if not
}
検討例
class Animal {
public void eat(String str) {
System.out.println("Eating for grass");
}
}
class Goat extends Animal {
public void eat(String str) {
System.out.println("blank");
}
}
class Another extends Goat{
public void eat(String str) {
System.out.println("another");
}
}
public class InheritanceSample {
public static void main(String[] args) {
Animal a = new Animal();
Another t5 = (Another) new Goat();
}
}
時 Another t5 = (Another) new Goat()
:を取得しま ClassCastException
ることができないため、インスタンスを生成し、 Another
クラスを使用 Goat
.
注意:変換に有効である場合のみのクラスは親クラスの子供のクラスは、鋳その親クラスです。
にどう対処すればよいかという ClassCastException
:
- 注意しようとした場合にキャストクラスのオブジェクトを別のクラスです。確実に新しいタイプに所属し、その親会社。
- を防ぐことが出来ます。ClassCastExceptionを用いジェネリック医薬品、ジェネリック医薬品の提供をコンパイル時にチェックできているわけではありませんのでタイプ-安全です。
あなたはそれがないクラスのインスタンスとしてオブジェクトを処理しようとしています。これは、(ピアノをギターにはない、ダンパーペダルを持っている)ギターでダンパーペダルを押ししようとするとほぼ似ています。
あなたはキャストの概念を理解していますか?鋳造は、そのために静的型付け言語Javaで非常に一般的である型変換のプロセスです。いくつかの例:
int型に文字列 "1" をキャスト - >問題ありません。
int型に文字列 "ABC" をキャスト - > 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 its a dog.
Cat c = (Dog) a; // Raises class cast exception; you can't cast a dog to a cat.
クラスのキャスト例外は、Javaによってスローされます。
Javaは、私たちがいる限り、鋳造は互換性のあるデータ型の間で起こるように別の型の変数をキャストすることができます。
は、たとえば、あなたは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が得られます。あなたが整数を文字列にキャストしようとしているので、それが例外をスローします。
あなたはより良いClassCastExceptionが理解し、あなたはJVMが不明を推測することができないことを実現した後、鋳造することができます。 BはAのインスタンスである場合には、マッピングのターゲットが大きいのでA.ザ・JVMがBにキャストする方法を推測することはできませんよりも、ヒープ上に複数のクラスのメンバーとメソッドを持っており、JVMは、追加メンバーを埋める方法を知ることができません。
しかし、AがBのインスタンスであった場合、マッピングが一対一であろうように、Aは、Bの完全なインスタンスへの参照であるため、それは、可能である。
A Javaの場合ClassCastExceptionはあなたが不適切型から別の型クラスを変換しようとすると発生する可能性が例外である。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ClassCastExceptionExample {
public ClassCastExceptionExample() {
List list = new ArrayList();
list.add("one");
list.add("two");
Iterator it = list.iterator();
while (it.hasNext()) {
// intentionally throw a ClassCastException by trying to cast a String to an
// Integer (technically this is casting an Object to an Integer, where the Object
// is really a reference to a String:
Integer i = (Integer)it.next();
}
}
public static void main(String[] args) {
new ClassCastExceptionExample();
}
}
:あなたは、このJavaプログラムを実行しようとすると、あなたはそれが、次のClassCastExceptionがスローされますことがわかります
Exception in thread "main" java.lang.ClassCastException: java.lang.String
at ClassCastExceptionExample (ClassCastExceptionExample.java:15)
at ClassCastExceptionExample.main (ClassCastExceptionExample.java:19)
例外がここにスローされる理由は「1」私は私のリストオブジェクトを作成していたとき、私はリストに保存するオブジェクトが文字列であるということですが、その後、私は、このオブジェクトを取得しようとするとき、私は意図的に作ります整数にキャストしようとしているのミス。文字列を直接整数にキャストすることはできませんので - 整数は文字列のタイプではありません - ClassCastExceptionがスローされます。
。あなたは、オブジェクトをソートしたいが、クラスが同等またはコンパレータを実装していない場合は、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);
}
}
mainメソッド上のランタイムクラスのキャスト例外の下にスローされます。
スレッドの例外 "メイン" とjava.lang.ClassCastException:com.default.Animalがjava.lang.Comparableとにキャストすることはできません。