ClassCastException類型轉換異常,是一個運行時異常。
非常常見就是不同類型之間的強制類型轉換就會拋出ClassCastException異常。還有一種就是不同ClassLoader加載的相同的類型轉換也會拋出ClassCastException。接下來我用代碼來詳細解釋下。
1、 強制類型轉換
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
}
}
把貓轉換成狗,是不對的。后面注釋為4的代碼是無法正常賦值的。
Exception in thread "main" java.lang.ClassCastException: Cat cannot be cast to Dog
at ClassCastExceptionTest.main(ClassCastExceptionTest.java:13)
2、 不同classloader加載相同類型類之間的轉換
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的時候要注意了,不一定是強制類型轉換導致的,也有可能不同的classloader加載了相同的類,然后這個類不同的實例進行賦值。