ClassCastException
ClassCastException類型轉(zhuǎn)換異常,是一個運(yùn)行時異常。
非常常見就是不同類型之間的強(qiáng)制類型轉(zhuǎn)換就會拋出ClassCastException異常。還有一種就是不同ClassLoader加載的相同的類型轉(zhuǎn)換也會拋出ClassCastException。接下來我用代碼來詳細(xì)解釋下。
1、 強(qiáng)制類型轉(zhuǎn)換
public class ClassCastExceptionTest {
/**
* @param args
*/
public static void main(String[] args) {
Animal a1 = new Dog(); //1
Animal a2 = new Cat(); //2
Dog d1 = (Dog)a1; //3
Dog d2 = (Dog)a2; //4
}
}
把貓轉(zhuǎn)換成狗,是不對的。后面注釋為4的代碼是無法正常賦值的。
Exception in thread "main" java.lang.ClassCastException: Cat cannot be cast to Dog
at ClassCastExceptionTest.main(ClassCastExceptionTest.java:13)
2、 不同classloader加載相同類型類之間的轉(zhuǎn)換
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
public class ClassCastExceptionTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
File file = new File(Thread.currentThread().getContextClassLoader().getResource("").getPath());
URL[] urls = {file.toURL()};
URLClassLoader classloader1 = new URLClassLoader(urls, ClassLoader.getSystemClassLoader().getParent());
Class classloader1Animal1 = classloader1.loadClass("Dog");
Dog dog1 = (Dog)classloader1Animal1.newInstance();
URLClassLoader classloader2 = new URLClassLoader(urls, ClassLoader.getSystemClassLoader().getParent());
Class classloader1Animal2 = classloader1.loadClass("Dog");
Dog dog2 = (Dog)classloader1Animal1.newInstance();
dog1 = dog2;
}
}
代碼中我們看到dog1=dog2,這樣賦值是會拋異常的。
Exception in thread "main" java.lang.ClassCastException: Dog cannot be cast to Dog
at ClassCastExceptionTest.main(ClassCastExceptionTest.java:17)
以后大家遇到classCastException的時候要注意了,不一定是強(qiáng)制類型轉(zhuǎn)換導(dǎo)致的,也有可能不同的classloader加載了相同的類,然后這個類不同的實(shí)例進(jìn)行賦值。
posted on 2012-01-10 16:07 yangpingyu 閱讀(585) 評論(0) 編輯 收藏 所屬分類: java基礎(chǔ)