Java基礎(chǔ)知識點(diǎn)(七)

Java異常

一、概念

1琳拭、異常:有異于常態(tài)训堆,和正常情況不一樣,有錯(cuò)誤出現(xiàn)白嘁,阻止當(dāng)前方法或作用域坑鱼。

2、異常處理:將出現(xiàn)的異常提示給編程人員與用戶絮缅,使原本將要中斷的程序繼續(xù)運(yùn)行或者退出鲁沥。并且能夠保存數(shù)據(jù)和釋放資源。

二耕魄、異常體系結(jié)構(gòu)

  • 1画恰、所有異常都繼承于Throwable類,其下有兩大子類:

    • (1)Error類:錯(cuò)誤吸奴,一般編程人員不太接觸允扇,如虛擬機(jī)錯(cuò)誤、線程死鎖则奥。硬傷:使程序崩潰
    • (2)Exception類:異常考润,編碼、環(huán)境读处、用戶輸入等問題糊治,其子類主要有:
      • 非檢查異常(運(yùn)行時(shí)異常RuntimeException):【由java虛擬機(jī)自動(dòng)捕獲】如空指針NullPointer、越界ArrayIndexOutofBounds档泽、錯(cuò)誤類型轉(zhuǎn)換ClassCast俊戳、算數(shù)異常Arithmetic等


      • 檢查異常CheckException:【需要手動(dòng)添加捕獲和處理語句】文件異常IO等

三揖赴、異常處理:

try-catch(多catch塊)-finally

  • (1)try塊:負(fù)責(zé)捕獲異常馆匿,一旦try中發(fā)現(xiàn)異常,程序的控制權(quán)將被移交給catch塊中的異常處理程序燥滑〗ケ保【try語句塊不可以獨(dú)立存在,必須與 catch 或者 finally 塊同存】
  • (2)catch塊:如何處理铭拧?比如發(fā)出警告:提示赃蛛、檢查配置、網(wǎng)絡(luò)連接搀菩,記錄錯(cuò)誤等呕臂。執(zhí)行完catch塊之后程序跳出catch塊,繼續(xù)執(zhí)行后面的代碼肪跋。
    • 編寫catch塊的注意事項(xiàng):多個(gè)catch塊處理的異常類歧蒋,要按照先catch子類后catch父類的處理方式,因?yàn)闀?huì)【就近處理】異常(由上自下)。
  • (3)finally:最終執(zhí)行的代碼谜洽,用于關(guān)閉和釋放資源等
try{
//一些會(huì)拋出的異常
}catch(Exception e){
//處理該異常的代碼塊
}finally{
//最終要執(zhí)行的代碼
} 

try-catch-finally執(zhí)行順序:

  • ①執(zhí)行try{}塊
  • ②如果try{}塊有異常產(chǎn)生萝映,執(zhí)行catch{}塊
  • ③無論有沒有異常都要執(zhí)行finally{}塊,這里可以看出只要finally中有return阐虚,必然返回finally{}中的return

return的執(zhí)行序臂,

  • ①,如果finally{}塊中有return語句实束,只執(zhí)行finally{}塊中的return語句
  • ②奥秆,如果finally{}塊中沒有return語句,如果try{}有異常咸灿,則返回catch{}中的return語句吭练,不然執(zhí)行try{}中return語句
    如果finally語句塊中有return語句,try/catch語句塊中的return語句會(huì)被忽視

在try-catch-finally之外還可以有return析显,這種情況下在catch和try里面兩者之一能有return鲫咽,不能同時(shí)有,且當(dāng)當(dāng)有兩者之一語句執(zhí)行時(shí)會(huì)返回兩者之一的return谷异,不會(huì)返回語句外的return值分尸,當(dāng)兩者之一的return不執(zhí)行時(shí)才會(huì)返回語句外的return值。finally與語句外不能同時(shí)存在return歹嘹,當(dāng)否則會(huì)報(bào)錯(cuò)

四箩绍、Java 中的異常拋出以及自定義異常

兩個(gè)重要的關(guān)鍵字:throw和throws

  • 1.throws的異常列表可以是拋出一條異常,也可以是拋出多條異常尺上,每個(gè)類型的異常中間用逗號隔開
  • 2.方法體中調(diào)用會(huì)拋出異常的方法或者是先拋出一個(gè)異常:用throw new Exception()
    throw寫在方法體里材蛛,表示“拋出異常”這個(gè)動(dòng)作
  • 3.如果某個(gè)方法調(diào)用了拋出異常的方法怎抛,那么必須添加try catch語句去嘗試捕獲這種異常卑吭,
    或者添加聲明,將異常拋出給更上一層的調(diào)用者進(jìn)行處理
  • 4.自定義異常:
class 自定義異常類 extends 異常類型{
    }

上面的異常類型可以是Exception马绝,也可以是其子類

Java 中的異常鏈

只有Error豆赏,Exception,RuntimeException提供了帶cause參數(shù)的構(gòu)造器富稻,其他的所有異常類只能通過initCause()來設(shè)置cause掷邦。

所有Throwable的子類構(gòu)造器中都可以接受一個(gè)cause對象作為參數(shù)。cause是異常原由椭赋,代表著原始異常抚岗。既可以在當(dāng)前位置創(chuàng)建并拋出行的異常,也可以通過cause追蹤到異常最初發(fā)生的位置哪怔。

異常鏈?zhǔn)且环N面向?qū)ο缶幊碳夹g(shù)宣蔚,指將捕獲的異常包裝進(jìn)一個(gè)新的異常中并重新拋出的異常處理方式廷痘。原異常被保存為新異常的一個(gè)屬性(比如cause)。這個(gè)想法是指一個(gè)方法應(yīng)該拋出定義在相同的抽象層次上的異常件已,但不會(huì)丟棄更低層次的信息笋额。

把捕獲的異常包裝成新的異常,在新異常里添加原始的異常篷扩,并將新異常拋出兄猩,它們就像是鏈?zhǔn)椒磻?yīng)一樣,一個(gè)導(dǎo)致(cause)另一個(gè)
這個(gè)想法是指一個(gè)方法應(yīng)該拋出定義在相同的抽象層次上的異常鉴未,(將所有捕獲到的異常包裝為新的異常類枢冤,即定義在相同的抽象層次上拋出)但不會(huì)丟棄更低層次的信息。

實(shí)現(xiàn)異常鏈功能的兩種基本寫法:

public class ChainTest {

    /**
     * test1()拋出喝大了異常
     * test2()調(diào)用test1()捕獲喝大了異常铜秆,并且包裝成運(yùn)行時(shí)異常淹真,繼續(xù)拋出
     * main方法中調(diào)用test2(),嘗試捕獲 test2()方法拋出的異常
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ChainTest ct = new ChainTest();
        try{
            ct.test2();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public void test1() throws DrunkException{
        throw new DrunkException("喝酒別開車");
    }
    
    public void test2(){
        try {
            test1();
        } catch (DrunkException e) {
            // TODO Auto-generated catch block
            RuntimeException newExc = new RuntimeException("司機(jī)一滴酒连茧,親人兩行淚");
            newExc.initCause(e);
            throw newExc;
            
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末核蘸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子啸驯,更是在濱河造成了極大的恐慌客扎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罚斗,死亡現(xiàn)場離奇詭異徙鱼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)针姿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門袱吆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人距淫,你說我怎么就攤上這事绞绒。” “怎么了溉愁?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵处铛,是天一觀的道長饲趋。 經(jīng)常有香客問我拐揭,道長,這世上最難降的妖魔是什么奕塑? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任堂污,我火速辦了婚禮,結(jié)果婚禮上龄砰,老公的妹妹穿的比我還像新娘盟猖。我一直安慰自己讨衣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布式镐。 她就那樣靜靜地躺著反镇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娘汞。 梳的紋絲不亂的頭發(fā)上歹茶,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音你弦,去河邊找鬼惊豺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛禽作,可吹牛的內(nèi)容都是我干的尸昧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旷偿,長吁一口氣:“原來是場噩夢啊……” “哼烹俗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起萍程,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衷蜓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尘喝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磁浇,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年朽褪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了置吓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缔赠,死狀恐怖衍锚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嗤堰,我是刑警寧澤戴质,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站踢匣,受9級特大地震影響告匠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜离唬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一后专、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧输莺,春花似錦戚哎、人聲如沸裸诽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丈冬。三九已至,卻和暖如春甘畅,著一層夾襖步出監(jiān)牢的瞬間殷蛇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工橄浓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粒梦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓荸实,卻偏偏與公主長得像匀们,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子准给,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 一個(gè)Java源程序是由若干個(gè)類組成泄朴。 2 class 是Java的關(guān)鍵字,用來定義類露氮。 3 Java應(yīng)用程序中...
    少帥yangjie閱讀 2,391評論 1 8
  • 1祖灰、面向?qū)ο蟮奶卣饔心男┓矫妫看穑好嫦驅(qū)ο蟮奶卣髦饕幸韵聨讉€(gè)方面: 抽象:抽象是將一類對象的共同特征總結(jié)出來構(gòu)造...
    行者_(dá)zm閱讀 563評論 0 0
  • 異常處理 Exception 和 Error 都繼承 Throwable 畔规。只有 Throwable 類的對象才...
    qyfl閱讀 101評論 0 0
  • 1局扶、Error和Exception有什么區(qū)別? Error表示編譯時(shí)和系統(tǒng)錯(cuò)誤叁扫,通常不能預(yù)期和恢復(fù)三妈,比如硬件故障、...
    夏與清風(fēng)閱讀 660評論 0 1
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月莫绣,有人笑有人哭畴蒲,有人歡樂有人憂愁,有人驚喜有人失落对室,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53