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

    Fruit f;

    Apple a = (Apple)f;

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

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

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


    ClassLoader

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

    1.        自定義和擴(kuò)展JVM加載類的方式。例如,增加對新的類庫(網(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

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

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

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

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

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

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

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

     

    參考文獻(xiàn):

    dev2dev專刊 2005 第二期

    j2sdk-1_5_0-doc

    posted on 2005-12-18 18:57 Flyingis 閱讀(28705) 評(píng)論(4)  編輯  收藏 所屬分類: 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 | 鄭昌奮
    主站蜘蛛池模板: 亚洲最新黄色网址| 亚洲网站在线免费观看| 中文字幕无码亚洲欧洲日韩| 亚洲精品自产拍在线观看| 国产免费69成人精品视频| 国产精品色拉拉免费看| 99热这里有免费国产精品| 国产一级a毛一级a看免费视频| 亚洲高清国产拍精品熟女| 亚洲av无码久久忘忧草| 亚洲三级电影网址| 国产亚洲精品美女久久久| 亚洲综合亚洲综合网成人| 在线看片无码永久免费aⅴ| 最近最新的免费中文字幕 | 免费真实播放国产乱子伦| 男女超爽刺激视频免费播放 | 国产亚洲美日韩AV中文字幕无码成人| 免费涩涩在线视频网| 西西大胆无码视频免费| 久久笫一福利免费导航| 久久午夜夜伦鲁鲁片免费无码影视| 暖暖免费日本在线中文| 精品视频在线免费观看| baoyu122.永久免费视频| 亚洲精品国产日韩无码AV永久免费网| 黄色一级视频免费| 高潮内射免费看片| 麻豆安全免费网址入口| eeuss草民免费| 久久er国产精品免费观看8| 国产永久免费高清在线| 国产午夜精品理论片免费观看 | 亚洲熟女乱综合一区二区| 亚洲精品456播放| 亚洲熟女一区二区三区| 国产精品久久久亚洲| 亚洲αv在线精品糸列| 4444亚洲国产成人精品| 亚洲一级免费视频| 亚洲色偷偷色噜噜狠狠99|