程序在運(yùn)行或者編譯的過程當(dāng)中發(fā)生了問題稱為異常了牛,異常處理的時(shí)候系統(tǒng)進(jìn)行是模糊匹配偷办,也就是說只要處理的異常大于發(fā)生的異常就可以了
? ? ? ? ?假設(shè)調(diào)用了一個(gè)不是自己寫的方法谍婉,該方法執(zhí)行某些有風(fēng)險(xiǎn)的任務(wù)彪腔,可能會(huì)在運(yùn)行期間出狀況攒钳,你必須認(rèn)識(shí)到該方法的是有風(fēng)險(xiǎn)的,你得寫出發(fā)生狀況時(shí)的處理代碼香浩,未雨綢繆
面試題:
使用什么方式可以使程序停止運(yùn)行类缤?
1程序發(fā)生未處理的異常
2使用System.exit(int status)
面試題:java代碼是從上往下執(zhí)行,所以當(dāng)try跟多個(gè)catch邻吭,如果第一個(gè)catch已經(jīng)catch住異常餐弱,那么下面的catch就不會(huì)繼續(xù)執(zhí)行
運(yùn)行期出現(xiàn)的錯(cuò)誤
Throwable:
Error:JVM內(nèi)部錯(cuò)誤,無(wú)法處理
Exception:外在因素導(dǎo)致一般性錯(cuò)誤 ?
(1)RuntimeException ?可以不捕獲,出錯(cuò)后改代碼(邏輯異常)
(2)其他(編譯異常):需捕獲
異常的處理方式
(1)拋出異常:格式 ?throws ?異常類名 ? ? ? ? ? //調(diào)用者必須要處理main膏蚓,不然就漏給虛擬機(jī)了
(2)如果把有風(fēng)險(xiǎn)程序代碼放在try/catch塊猖败,編譯器會(huì)放心很多,try/catch塊會(huì)告訴編譯器你確實(shí)知道所調(diào)用方法會(huì)有風(fēng)險(xiǎn)降允,并且也已經(jīng)準(zhǔn)備好處理它恩闻。注:try{}和catch{}之間不可以有代碼
捕獲異常 ? try { ?把有風(fēng)險(xiǎn)的程序放在try塊中; ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? }catch(異常類 ?變量名){
? ? ? ? ? ? ? ? ?用catch塊擺放異常狀況處理程序剧董;} ? ? ? ? ? ? ? ?//常用e.printstackTrace()打印異常名+異常信息+異常位置
? ? ? ? ? ? ? ? finally{一定執(zhí)行代碼幢尚; ? 一般用于關(guān)閉資源
? ? ? ? ? ? ? }
注意:try{ }大括號(hào)里定義的變量,finall里不能調(diào)用
//雖然異常也具有多態(tài)翅楼,但應(yīng)該先抓小錯(cuò)再抓大錯(cuò)尉剩,因?yàn)橹苯幼ギ惓5母割悾赡軙?huì)搞不清到底在哪里出了錯(cuò)
? ? ? 在繼承樹上的層次越高毅臊,“籃子”也越大理茎,當(dāng)你沿著繼承樹往下走,異常類就會(huì)越來(lái)越有特定的取向管嬉,catch的“籃子”越來(lái)越小皂林,也就更容易確定是到底在哪里出了錯(cuò)誤
? ? ? ? ? 如果try的代碼沒出錯(cuò),則跳過catch繼續(xù)執(zhí)行蚯撩,如果try的代碼出錯(cuò)础倍,則只執(zhí)行catch內(nèi)容(出錯(cuò)代碼之后catch之前代碼不執(zhí)行),finally里面放的是不管出不出錯(cuò)都要執(zhí)行的代碼胎挎,如果try沟启,catch里有return語(yǔ)句,finally里的內(nèi)容一樣會(huì)執(zhí)行犹菇。
a德迹、finally中的代碼總是會(huì)執(zhí)行嗎?
答:no揭芍,如果一個(gè)方法內(nèi)在執(zhí)行try{}語(yǔ)句之前就已經(jīng)return了胳搞,那么finally語(yǔ)句指定不會(huì)執(zhí)行了。因?yàn)樗緵]有進(jìn)入try語(yǔ)句中
如果在一個(gè)try語(yǔ)句中調(diào)用System.exit(0);方法沼沈,那么就會(huì)退出當(dāng)前java虛擬機(jī),那么finally也就沒有執(zhí)行的機(jī)會(huì)了列另。
b页衙、finally在return之前執(zhí)行還是在return之后執(zhí)行?
答:很多人可能會(huì)說在return執(zhí)行之前執(zhí)行艰躺。我的答案是在return中間執(zhí)行眨八,是不是很特別廉侧,請(qǐng)按下面的例子:
請(qǐng)問輸出的結(jié)果是多少呢段誊?
正確答案是:1
下面我來(lái)講解一下這個(gè)程序的執(zhí)行過程,
首先程序在執(zhí)行到try{}語(yǔ)句中的return方法后没陡,就會(huì)先返回相應(yīng)的值盼玄,并把相應(yīng)的值存儲(chǔ)在一個(gè)臨時(shí)棧中去保存這個(gè)結(jié)果潜腻。這時(shí)臨時(shí)棧中存儲(chǔ)的值為1。
但是程序不會(huì)立刻返回蝌箍,轉(zhuǎn)而回去執(zhí)行finally中的方法暴心,++x,在finally執(zhí)行完后专普,方法全部執(zhí)行完,這時(shí)會(huì)再次調(diào)用return方法筋粗,注意這時(shí)不在是返回值炸渡,而是告訴主調(diào)程序,被調(diào)程序已經(jīng)執(zhí)行完了买决,你可以接著去執(zhí)行你主程序的其它方法了。但是請(qǐng)注意嘁灯,此時(shí)返回的值還是原來(lái)保存在臨時(shí)
棧中的值1丑婿。
標(biāo)識(shí)異常
遇到throw 程序就結(jié)束了
人工拋出異常(JVM不認(rèn)為是錯(cuò)的没卸,但是不合乎清理) ?等同自定義異常
?//人工拋出異常后尘奏,當(dāng)運(yùn)行此方法或調(diào)用此方法的時(shí)候病蛉,程序會(huì)認(rèn)為這有一個(gè)錯(cuò)誤,必須throws或try catch
? ? ? ? ? ? 只有聲明了此處是一個(gè)需要捕獲的異常的時(shí)候俗孝,catch才能去抓住它魄健。類似于抓嫌疑人,只有嫌疑人被通緝的時(shí)候革骨,其它地方的警察才會(huì)知道這是一個(gè)嫌疑犯良哲,然后取抓它
創(chuàng)建用戶自定義異常類:必須繼承現(xiàn)有異常類 1.Exception ?2.RuntimeException常用
class ( ? ) extends(){
}
? ? ? ? ?創(chuàng)建自定義異常的步驟就是助隧,先創(chuàng)建一個(gè)異常類繼承原來(lái)的異常,然后在try catch中并村,用if判斷,如果出現(xiàn)這種情況哩牍,就標(biāo)識(shí)這個(gè)異常棚潦。和直接標(biāo)示異常原有異常相比的區(qū)別就是,打印的異常信息不同了瓦盛,打印出的是你自定義的異常類的信息洗显。 ?其它和拋出原有異常的效果一模一樣
面試題
舉出常用的五種運(yùn)行時(shí)異常
NullPointException空指針異常
ArithmeticException算術(shù)異常
IllegalArgumentException方法參數(shù)異常
ClassCastException類型強(qiáng)制轉(zhuǎn)換異常
IndexOutOfBoundsException:索引下標(biāo)越界異常