ClassCastException,從字面上看,是類型轉換錯誤,通常是進行強制類型轉換時候出的錯誤。下面對產生ClassCastException異常的原因進行分析,然后給出這種異常的解決方法。
這種異常是如何產生的呢?舉一個比較形象的例子。
Animal表示動物,Dog表示狗,是動物的子類,Cat表示貓,是動物的子類。看下面的代碼:
Animal a1 = new Dog(); // 1
Animal a2 = new Cat(); // 2
Dog d1 = (Dog)a1; //3
Dog d2 = (Dog)a2; //4
第3行代碼和第4行代碼基本相同,從字面意思看都是把動物(Animal)強制轉換為狗(Dog),但是第4行代碼將產生java.lang.ClassCastException。原因是你要把一個貓(a2這只動物是貓)轉換成狗,而第3行中是把狗轉換成狗,所以可以。
從上面的例子看,java.lang.ClassCastException是進行強制類型轉換的時候產生的異常,強制類型轉換的前提是父類引用指向的對象的類型是子類的時候才可以進行強制類型轉換,如果父類引用指向的對象的類型不是子類的時候將產生java.lang.ClassCastException異常。就是上面a1和a2都是動物,但是a1這只動物是一只狗,而a2這只動物是貓,所以要把a1轉換成狗可以,因為a1本身就是狗,而a2是一只貓,所以要轉換成狗就出錯了。
遇到這樣的異常的時候如何解決呢?如果你知道要訪問的的對象的具體類型,直接轉換成該類型即可。如果不能確定類型可以通過下面的兩種方式進行處理(假設對象為o):
1、通過o.getClass().getName()得到具體的類型,可以通過輸出語句輸出這個類型,然后根據類型進行進行具體的處理。
2、通過if(o instanceof 類型)的語句來判斷o的類型是什么。