Part 3-1 Java 異常 2020-01-07

什么是異常:

1.異常字面翻譯就是“意外、例外”的意思凡壤,也就是非正常情況极阅。

2.異常本質(zhì)上是程序上的錯誤。


程序中的異常:

1 .在編譯期間出現(xiàn)的錯誤有編譯器幫助我們一起修正疗涉,然而運(yùn)行期間的錯誤便不是編譯器力所能及了,并且運(yùn)行期間的錯誤往往是難以預(yù)料的吟秩。

2. 在程序運(yùn)行過程中咱扣,意外發(fā)生的情況,背離我們程序本身的意圖的表現(xiàn)涵防,都可以理解為異常闹伪。

3. 當(dāng)程序在運(yùn)行期間出現(xiàn)了異常,如果置之不理壮池,程序可能會不正常運(yùn)行偏瓤、強(qiáng)制中斷運(yùn)行、造成用戶數(shù)據(jù)丟失椰憋、資源無法正常釋放厅克、直接導(dǎo)致系統(tǒng)崩潰。

4. Java提供了異常機(jī)制來進(jìn)行處理橙依,通過異常機(jī)制证舟,我們可以更好地提升程序的健壯性。


異常例子:

使用空的對象引用調(diào)用方法

String str = null窗骑;

System.out.println( str.length() );


數(shù)組訪問時下標(biāo)越界

int[] ary={1,2,3};

for(int i=0;i<=3;i++){

? ? System.out.println(ary[i]);? }


算術(shù)運(yùn)算時除數(shù)為0

int one= 12; int two=0;

System.out.println(one/two);


類型轉(zhuǎn)換時無法正常轉(zhuǎn)型

class Animal{}

class Dog extends Animal{}

class Cat extends Animal{}

public class Test{

????public static void main[String[] args]{

? ? ? ? Animal a1= new Dog();

? ?????? Animal a2= new Cat();

? ? ? ? Dog d1 = (Dog)a1;

? ? ? ? Dog d2 = (Dog)a2;

????}

}





異常的分類:


圖1.異常分類圖


Error:

? ? 1.我們編寫程序時不需要關(guān)心這類異常女责。

? ? 2.Error是程序無法處理的錯誤,大多數(shù)錯誤與代碼編寫者執(zhí)行的操作無關(guān)创译,表示是代碼運(yùn)行時JVM(Java 虛擬機(jī))出現(xiàn)的問題抵知。

? ?3.這些錯誤是不可查的,因為它們在應(yīng)用程序的控制和處理能力之外软族,而且絕大多數(shù)是程序運(yùn)行時不允許出現(xiàn)的狀況刷喜。

? ?4.對于設(shè)計合理的應(yīng)用程序來說,即使確實發(fā)生了錯誤互订,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況吱肌。


Exception:

? ? 1. Exception是程序本身可以處理的異常。異常處理經(jīng)常指針對這種異常的處理.

? ? 2. Exception類的異常包括 checked exception 和 uncheckedexception仰禽。


? ?unchecked exception

? ? ? ? 1. 編譯器不要求強(qiáng)制處置的異常氮墨。

? ? ? ? 2. 包含RuntimeException類及其子類異常纺蛆。

? ? ? ? 3.? 如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標(biāo)越界異常)等规揪,這些異常是unchecked exception 桥氏。

? ? ? ? 4.??Java編譯器不會檢查這些異常,在程序中可以選擇捕獲處理猛铅,也可以不處理字支,照樣正常編譯通過。


? ?checked exception

? ? ? ? 1. 編譯器要求必須處置的異常奸忽。

? ? ? ? 2.?是RuntimeException及其子類以外堕伪,其他的Exception類的子類。如IOException栗菜、SQLException等

? ? ? ? 3.?Java編譯器會檢查這些異常欠雌,當(dāng)程序中可能出現(xiàn)這類異常時,要求必須進(jìn)行異常處理疙筹,否則編譯不會通過富俄。





異常處理:?拋出異常、捕捉異常

? ??異扯兀總是先被拋出霍比,后被捕捉的。

????對于可查異常必須捕捉暴备、或者聲明拋出悠瞬。

? ??允許忽略:不可查的RuntimeException和Error。

拋出異常

? ? 1.當(dāng)一個方法出現(xiàn)錯誤引發(fā)異常時馍驯,方法創(chuàng)建異常對象交付運(yùn)行時系統(tǒng)阁危。

? ? 2.異常對象中包括異常類型和異常出現(xiàn)的時程序狀態(tài)等異常信息。

? ? 3.運(yùn)行時系統(tǒng)負(fù)責(zé)尋找處置異常的代碼并執(zhí)行汰瘫。


捕獲異常

? ? 1. 在方法拋出異常之后狂打,運(yùn)行時系統(tǒng)將轉(zhuǎn)為尋找合適的異常處理器。

? ? 2. 運(yùn)行時系統(tǒng)從發(fā)生異常的方法開始混弥,依次回查調(diào)用棧中的方法趴乡,當(dāng)異常處理器所能處理的異常類型與方法拋出異常類型相符時,即合適的異常處理器蝗拿。

? ? 3.?當(dāng)運(yùn)行時系統(tǒng)遍歷調(diào)用棧而未找到合適的異常處理器晾捏,則運(yùn)行時系統(tǒng)終止。同時哀托,意味著Java程序的終止惦辛。





處理實現(xiàn)

通過5個關(guān)鍵字來實現(xiàn):try、catch仓手、 finally胖齐、throw玻淑、throws

捕獲:try,catch呀伙、 finally

? ? ? ? ? ?try:執(zhí)行可能執(zhí)行異常的代碼

? ? ? ? ? ?catch:捕獲異常

? ? ? ? ? ? finally:無論是否發(fā)生異常补履,代碼總能執(zhí)行

聲明:throws

? ? ? ? ? ? throws:聲明可能要拋出的異常

拋出:throw

????????????throw :手動拋出異常


?try-catch-finally


圖2.常規(guī)使用

? ??

try-catch( 有異常,能處理)

? ??

圖2.無finally有異常處理??


圖3. 處理流程


try-catch(?有異常剿另,不能處理)


圖4.無finally有異常處理??


圖5.處理流程


try-catch( 無異常)


圖6.無finally無異常處理


圖7.處理流程





多重catch塊

????????1. 一旦某個catch捕獲到匹配的異常類型箫锤,將進(jìn)入異常處理代碼。一經(jīng)處理結(jié)束雨女,就意味著整個try-catch語句結(jié)束谚攒。其他的catch子句不再有匹配和捕獲異常類型的機(jī)會

????????2.?對于有多個catch子句的異常程序而言戚篙,應(yīng)該盡量將捕獲底層異常類的catch子句放在前面五鲫,同時盡量將捕獲相對高層的異常類的catch子句放在后面。否則岔擂,捕獲底層異常類的catch子句將可能會被屏蔽。

規(guī)則:

? ??????1.排列catch 語句的順序:先子類后父類浪耘。

? ??????2.發(fā)生異常時按順序逐個匹配乱灵。

????? ??3.只執(zhí)行第一個與異常類型匹配的catch語句。


圖8.多重catch


圖9.處理流程





try-catch-finally

1.?try塊后可以接零個或多個catch塊

2.?如果沒有catch七冲,則必須跟一個finally塊

語法組合:

try-catch

try-finally

try-catch-finally

try-catch-catch-finally


圖9.?有finally有異常處理??


圖10.處理流程


實際應(yīng)用中的經(jīng)驗與總結(jié)

????1. 處理運(yùn)行時異常時痛倚,采用邏輯去合理規(guī)避同時輔助try-catch處理。

????2.?在多重catch塊后面澜躺,可以加一個catch(Exception)來處理可能會被遺漏的異常蝉稳。

????3.?對于不確定的代碼,也可以加上try-catch掘鄙,處理潛在的異常耘戚。

????4.?盡量去處理異常,切忌只是簡單的調(diào)用printStackTrace()去打印輸出操漠。

????5.?具體如何處理異常收津,要根據(jù)不同的業(yè)務(wù)需求和異常類型去決定。

????6. 盡量添加finally語句塊去釋放占用的資源浊伙。


常見異常類型


圖11.常見類型表





throw & throws

? ??可以通過throws聲明將要拋出何種類型的異常撞秋,通過throw將產(chǎn)生的異常拋出。

throws:

? ??如果一個方法可能會出現(xiàn)異常嚣鄙,但沒有能力處理這種異常吻贿,可以在方法聲明處用throws子句來聲明拋出異常。方法將不對這些類型及其子類類型的異常作處理哑子,而拋向調(diào)用該方法的方法舅列,由他去處理肌割。

? ?? 汽車在運(yùn)行時可能會出現(xiàn)故障,汽車本身沒辦法處理這個故障剧蹂, 那就讓開車的人來處理 声功。


????throws語句用在方法定義時聲明該方法要拋出的異常類型。

public void method() throws Exception1,Exception2,...,ExceptionN {

// 可能產(chǎn)生異常的代碼

}

使用規(guī)則:

? ????1. 如果是不可查異常(unchecked exception)宠叼,即Error先巴、RuntimeException或它們的子類,那么可以不使用throws關(guān)鍵字聲明要拋出的異常冒冬,編譯仍能順利通過伸蚯,但在運(yùn)行時會被系統(tǒng)拋出。


????????2. 如果一個方法中可能出現(xiàn)可查異常简烤,要么用try-catch語句捕獲剂邮, 要么用throws子句聲明將它拋出,否則會導(dǎo)致編譯錯誤


????????3. 當(dāng)拋出了異常横侦,則該方法的調(diào)用者必須處理或者重新拋出該異常挥萌。

? ??????4. 當(dāng)子類重寫父類拋出異常的方法,聲明的異常必須是父類方法所聲明異常的同類或子類枉侧。

throw:

? ??throw用來拋出一個異常引瀑。

? ? throw new IOException();?

????throw 拋出的只能夠是可拋出類Throwable 或者其子類的實例對象。

throw new String(“出錯啦”);?? 是錯誤的


圖12.使用情況1


圖13.使用情況2






自定義異常

1.使用Java內(nèi)置的異常類可以描述在編程時出現(xiàn)的大部分異常情況榨馁。

2.也可以通過自定義異常描述特定業(yè)務(wù)產(chǎn)生的異常類型憨栽。

3.所謂自定義異常,就是定義一個類翼虫,去繼承Throwable類或者? 它的子類屑柔。


圖14.范例






異常鏈


1.有時候我們會捕獲一個異常后再拋出另一個異常。

2.顧名思義就是:將異常發(fā)生的原因一個傳一個串起來珍剑,即把底層

的異常信息傳給上層掸宛,這樣逐層拋出


圖15.范例

先進(jìn)后出

圖16.產(chǎn)生的結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末次慢,一起剝皮案震驚了整個濱河市旁涤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迫像,老刑警劉巖劈愚,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闻妓,居然都是意外死亡菌羽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門由缆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來注祖,“玉大人猾蒂,你說我怎么就攤上這事∈浅浚” “怎么了肚菠?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罩缴。 經(jīng)常有香客問我蚊逢,道長,這世上最難降的妖魔是什么箫章? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任烙荷,我火速辦了婚禮,結(jié)果婚禮上檬寂,老公的妹妹穿的比我還像新娘终抽。我一直安慰自己,他們只是感情好桶至,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布昼伴。 她就那樣靜靜地躺著,像睡著了一般镣屹。 火紅的嫁衣襯著肌膚如雪亩码。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天野瘦,我揣著相機(jī)與錄音,去河邊找鬼飒泻。 笑死鞭光,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泞遗。 我是一名探鬼主播惰许,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼史辙!你這毒婦竟也來了汹买?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤聊倔,失蹤者是張志新(化名)和其女友劉穎晦毙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耙蔑,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡见妒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甸陌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片须揣。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡盐股,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耻卡,到底是詐尸還是另有隱情疯汁,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布卵酪,位于F島的核電站幌蚊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凛澎。R本人自食惡果不足惜霹肝,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塑煎。 院中可真熱鬧沫换,春花似錦、人聲如沸最铁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冷尉。三九已至漱挎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雀哨,已是汗流浹背磕谅。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留雾棺,地道東北人膊夹。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像捌浩,于是被迫代替她去往敵國和親放刨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361