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ǔ)

          <2012年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          收藏夾

          linux

          產(chǎn)品交互

          分析,設(shè)計(jì),架構(gòu)

          安全

          技術(shù)牛人

          數(shù)據(jù)庫

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 绩溪县| 汪清县| 麦盖提县| 象山县| 洛浦县| 江口县| 北流市| 二连浩特市| 清原| 肇庆市| 尤溪县| 望谟县| 新巴尔虎左旗| 临安市| 安阳县| 荔浦县| 普安县| 湾仔区| 鹿泉市| 金湖县| 崇明县| 屯留县| 康马县| 吐鲁番市| 辽阳市| 临夏县| 夹江县| 沧州市| 浪卡子县| 浠水县| 德清县| 通山县| 武威市| 乐山市| 玛纳斯县| 威海市| 淳化县| 邓州市| 师宗县| 阿拉善右旗| 红桥区|