<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評(píng)論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

    ClassCastException深入分析

    作者:Flyingis

          ClassCastException
    JVM在檢測(cè)到兩個(gè)類(lèi)型間轉(zhuǎn)換不兼容時(shí)引發(fā)的運(yùn)行時(shí)異常。此類(lèi)錯(cuò)誤通常會(huì)終止用戶請(qǐng)求。在執(zhí)行任何子系統(tǒng)的應(yīng)用程序代碼時(shí)都有可能發(fā)生ClassCastException異常。通過(guò)轉(zhuǎn)換,可以指示Java編譯器將給定類(lèi)型的變量作為另一種變量來(lái)處理。對(duì)基礎(chǔ)類(lèi)型和用戶定義類(lèi)型都可以轉(zhuǎn)換。Java語(yǔ)言規(guī)范定義了允許的轉(zhuǎn)換,其中大多數(shù)可在編譯時(shí)進(jìn)行驗(yàn)證。不過(guò),某些轉(zhuǎn)換還需要運(yùn)行時(shí)驗(yàn)證。如果在此運(yùn)行時(shí)驗(yàn)證過(guò)程中檢測(cè)到不兼容,JVM就會(huì)引發(fā)ClassCastException異常。例如:

    Fruit f;

    Apple a = (Apple)f;

    當(dāng)出現(xiàn)下列情況時(shí),就會(huì)引發(fā)ClassCastException異常:

    1.        FruitApple類(lèi)不兼容。當(dāng)應(yīng)用程序代碼嘗試將某一對(duì)象轉(zhuǎn)換為某一子類(lèi)時(shí),如果該對(duì)象并非該子類(lèi)的實(shí)例,JVM就會(huì)拋出ClassCastException異常。

    2.        FruitApple類(lèi)兼容,但加載時(shí)使用了不同的ClassLoader。這是這種異常發(fā)生最常見(jiàn)的原因。在這里,需要了解一下什么是ClassLoader


    ClassLoader

             ClassLoader是允許JVM查找和加載類(lèi)的一種Java類(lèi)。JVM有內(nèi)置的ClassLoader。不過(guò),應(yīng)用程序可以定義自定義的ClassLoader。應(yīng)用程序定義新的ClassLoader通常出于以下兩種原因:

    1.        自定義和擴(kuò)展JVM加載類(lèi)的方式。例如,增加對(duì)新的類(lèi)庫(kù)(網(wǎng)絡(luò)、加密文件等)的支持。

    2.        劃分JVM名稱空間,避免名稱沖突。例如,可以利用劃分技術(shù)同時(shí)運(yùn)行同一應(yīng)用程序的多個(gè)版本(基于空間的劃分)。此項(xiàng)技術(shù)在應(yīng)用服務(wù)器(WebLogic Server)內(nèi)的另一個(gè)重要用途是啟用應(yīng)用程序熱重新部署,即在不重新啟動(dòng)JVM的情況下啟動(dòng)應(yīng)用程序的新版本(基于時(shí)間的劃分)

    ClassLoader按層級(jí)方式進(jìn)行組織。除系統(tǒng)BootClassLoader外,其它ClassLoader都必須有父ClassLoader

    在理解類(lèi)加載的時(shí)候,需要注意以下幾點(diǎn):

    1.        永遠(yuǎn)無(wú)法在同一ClassLoader中重新加載類(lèi)。“熱重新部署”需要使用新的ClassLoader。每個(gè)類(lèi)對(duì)其ClassLoader的引用都是不可變的:this.getClass().getClassLoader()

    2.        在加載類(lèi)之前,ClassLoader始終會(huì)先詢問(wèn)其父ClassLoader(委托模型)。這意味著將永遠(yuǎn)無(wú)法重寫(xiě)“核心”類(lèi)。

    3.        同級(jí)ClassLoader間互不了解。

    4.        由不同ClassLoader加載的同一類(lèi)文件也會(huì)被視為不同的類(lèi),即便每個(gè)字節(jié)都完全相同。這是ClassCastException的一個(gè)典型原因。

    5.        可以使用Thread.setContextClassLoader(a)ClassLoader連接到線程的上下文。

    基于以上的基本原理,可以加深大家對(duì)ClassCastException的理解,和在碰到問(wèn)題時(shí)提供一種解決問(wèn)題的思路。

     

    參考文獻(xiàn):

    dev2dev專(zhuān)刊 2005 第二期

    j2sdk-1_5_0-doc

    posted on 2005-12-18 18:57 Flyingis 閱讀(28704) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): JavaSE

    評(píng)論

    # re: ClassCastException深入分析  回復(fù)  更多評(píng)論   

    收藏:http://m.tkk7.com/ephon/archive/2006/01/17/28279.html
    有收獲。
    2006-01-17 10:31 | NsGFr

    # re: ClassCastException深入分析  回復(fù)  更多評(píng)論   

    Thanks,解決了一個(gè)bug
    2006-01-24 10:31 | Sunny

    # re: ClassCastException深入分析  回復(fù)  更多評(píng)論   

    ClassLoader
    還是不懂
    2006-02-08 18:34 | http://m.tkk7.com/flyingis/

    # re: ClassCastException深入分析  回復(fù)  更多評(píng)論   

    android培訓(xùn)知識(shí)
    2012-08-08 09:07 | 鄭昌奮
    主站蜘蛛池模板: 亚洲精品无码久久| 国产亚洲高清在线精品不卡| 亚洲视频精品在线| 亚洲国产成a人v在线观看| 羞羞视频免费观看| 最近2019中文字幕免费直播| 99视频在线精品免费观看6| 亚洲精品国产va在线观看蜜芽| 久久亚洲国产欧洲精品一| 久久亚洲中文字幕精品有坂深雪| 亚洲欧洲专线一区| 成人毛片18女人毛片免费96| 亚洲AV无码不卡无码| 色欲aⅴ亚洲情无码AV蜜桃| 免费无码国产V片在线观看| 亚洲一区二区在线免费观看| 精品久久洲久久久久护士免费 | 歪歪漫画在线观看官网免费阅读 | 亚洲JLZZJLZZ少妇| 13一14周岁毛片免费| 精品国产亚洲男女在线线电影| 2022年亚洲午夜一区二区福利 | 久久久久国产精品免费免费不卡| 亚洲AV区无码字幕中文色 | 免费一区二区三区| 免费一级一片一毛片| 亚洲精品美女视频| 免费久久人人爽人人爽av| 6080午夜一级毛片免费看| 亚洲国产精品综合久久20| 国产在线观看免费完整版中文版 | 特级做A爰片毛片免费看无码| 黄网址在线永久免费观看 | 全部免费毛片免费播放| 两个人看www免费视频| 亚洲高清无在码在线电影不卡| 男人的好看免费观看在线视频| 立即播放免费毛片一级| 亚洲成A人片在线观看WWW| 色播在线永久免费视频| 中国性猛交xxxxx免费看|