請(qǐng)對(duì)比Exception和Error要糊,另外,運(yùn)行時(shí)異常與一般異常有什么區(qū)別妆丘?
Exception和Error
Exception和Error都是繼承了Throwable類锄俄,在Java中只有Throwable類型的實(shí)例才可以被throw或者catch局劲,它是異常處理機(jī)制的基本組成類型。
Exception和Error體現(xiàn)了Java平臺(tái)設(shè)計(jì)者對(duì)不同異常情況的分類奶赠。Exception是程序正常運(yùn)行中可以預(yù)料的意外情況鱼填,可以被捕獲進(jìn)行處理。Error指不大可能出現(xiàn)的情況毅戈,不需要捕獲苹丸。
運(yùn)行時(shí)異常與一般異常的區(qū)別
Exception可以分為checked異常(編譯 期異常)和unchecked異常(運(yùn)行時(shí)異常),編譯期異常在源代碼中必須顯式地進(jìn)行捕獲處理竹祷,運(yùn)行時(shí)異常不用必須捕獲不在編譯期強(qiáng)制要求谈跛,如NullPointerException、ArrayIndexOutOfBoundsException塑陵。
1感憾、盡量不要捕獲類似Exception這樣通用異常,而應(yīng)該捕獲特定異常令花。
2阻桅、不要生吞異常,要處理或者拋出兼都。
3嫂沉、在產(chǎn)品代碼中,不允許在捕獲異常之后printStackTrace()扮碧,因?yàn)樵趶?fù)雜系統(tǒng)中無(wú)法判斷輸出到哪里了趟章,最好使用產(chǎn)品日志。
4慎王、Java異常處理機(jī)制有兩個(gè)相對(duì)昂貴的地方:
? ?(1)try--catch 代碼段會(huì)產(chǎn)生額外的性能開(kāi)銷蚓土,盡量不要一個(gè)大的try包裹整段代碼
? ?(2)Java每實(shí)例化一個(gè)Exception都會(huì)對(duì)當(dāng)時(shí)的棧進(jìn)行快照,這是一個(gè)比較重的操作
NoClassDefFoundError和ClassNotFoundException區(qū)別
ClassNotFoundException產(chǎn)生的原因赖淤,Java支持使用Class.forName方法來(lái)動(dòng)態(tài)加載類蜀漆,如果這個(gè)類在路徑中沒(méi)有找到就會(huì)拋出ClassNotFoundException異常。
NoClassDefFoundError產(chǎn)生的原因咱旱,JVM或者ClassLoader嘗試加載類時(shí)找不到類的定義确丢,原因可能是打包過(guò)程中漏掉了部分類或者jar包出現(xiàn)損壞,就會(huì)導(dǎo)致NoClassDefFoundError錯(cuò)誤吐限。