簡(jiǎn)述Java異常機(jī)制的優(yōu)點(diǎn)
Java語(yǔ)言在設(shè)計(jì)之初就提供了相對(duì)完善的異常處理機(jī)制免糕,這也是Java的優(yōu)勢(shì)之一长搀;因?yàn)檫@種機(jī)制大大降低了編寫和維護(hù)可靠程序的門檻马绝。
Exception和Error的區(qū)別
Exception和Error都繼承了Throwable類嫂拴,在Java中只有Throwable類型的實(shí)例才會(huì)被拋出(throw)或者捕獲(catch),它是異常處理機(jī)制的基本組成類型
Exception和Error體現(xiàn)了Java平臺(tái)設(shè)計(jì)者對(duì)不同異常情況的分類。Exception是程序正常運(yùn)行中卡辰,可以預(yù)料的意外情況你踩。可能并且應(yīng)該被捕獲舅踪,進(jìn)行相應(yīng)的處理。
Error是指在正常情況下,不大可能出現(xiàn)的情況瞧甩,絕大部分的Error都會(huì)導(dǎo)致程序處于非正常的,不可恢復(fù)的狀 態(tài)弥鹦。既然是非正常情況肚逸,所以不便于也不需要捕獲,比如OutOfMemoryError之類彬坏,都是Error的子類朦促。
Exception又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常在源代碼里必須顯示地進(jìn)行捕獲處理栓始,這是編譯期檢查的一部分务冕。前面我介紹的不可查的Error,是Throwable不是Exception幻赚。
不檢查異常(運(yùn)行時(shí)異常)類似NullPointerException禀忆、ArrayIndexOutOfBoundsException之類,通常是可以編碼避免的錯(cuò)誤落恼。
Exception和Error的擴(kuò)展
- 理解Throwable箩退、Exception、Error的設(shè)計(jì)和分類佳谦。比如掌握那些應(yīng)用最為廣泛的子類乏德,以及如何自定義異常等。![ClassNotFoundException和NoClassDefFoundError的區(qū)別][(https://my.oschina.net/jasonultimate/blog/166932)
- 理解Java語(yǔ)言中操作Throwable的元素和實(shí)踐吠昭。
//try-with-resources的一種實(shí)現(xiàn)
public static void main(String [] args){
try(BufferedReader br = new BufferedReader(new Reader() {
@Override
public void close() throws IOException {
}
@Override
public int read(char[] chars, int i, int i1) throws IOException {
return 0;
}
}); BufferedWriter bw = new BufferedWriter(new Writer() {
@Override
public void close() throws IOException {
}
@Override
public void flush() throws IOException {
}
@Override
public void write(char[] chars, int i, int i1) throws IOException {
}
})){
br.close();
bw.close();
}catch (IOException e){
e.printStackTrace();
}
}
try{
Thread.sleep(1000L);
} catch (Exception e) {
e.printStackTrace();
}
上面這段代碼違反了異常處理的兩個(gè)基本原則喊括。
盡量不要捕獲類似Exception這樣的通用異常,而是應(yīng)該捕獲特定的異常矢棚。在這里Thread.sleep拋出的是InterruptedException郑什。
不要生吞(swallow)異常,這是異常處理中要特別注意的事情蒲肋,因?yàn)楹芸赡軙?huì)導(dǎo)致非常難以診斷的詭異情況蘑拯。
try-catch代碼段會(huì)產(chǎn)生額外的性能開銷钝满,或者換個(gè)角度說,它往往會(huì)影響JVM對(duì)代碼進(jìn)行優(yōu)化申窘,盡量不要一個(gè)大的try包住整段代碼弯蚜;Java每實(shí)例化一個(gè)Exception,都會(huì)對(duì)當(dāng)時(shí)的棧進(jìn)行快照,這是一個(gè)相對(duì)比較重的操作剃法。如果發(fā)生的非常頻繁碎捺,這個(gè)開銷可就不能被忽略了。