明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Java 異常處理7

[摘要]有爭議性的未被檢查的異常   因?yàn)镴ava編程語言不要求方法一定要捕獲或列出運(yùn)行異;蝈e(cuò)誤,所以程序員就可能被誤導(dǎo),編寫只拋出運(yùn)行時(shí)異常或者使所有的異常子類都繼承于RuntimException的代碼,這兩種快捷方式允許程序員編寫不用為編譯錯(cuò)誤而操心的代碼,并且也不費(fèi)神去指定或捕獲任何異常。盡管這...
有爭議性的未被檢查的異常

  因?yàn)镴ava編程語言不要求方法一定要捕獲或列出運(yùn)行異常或錯(cuò)誤,所以程序員就可能被誤導(dǎo),編寫只拋出運(yùn)行時(shí)異;蛘呤顾械漠惓W宇惗祭^承于RuntimException的代碼,這兩種快捷方式允許程序員編寫不用為編譯錯(cuò)誤而操心的代碼,并且也不費(fèi)神去指定或捕獲任何異常。盡管這種方法看上去對(duì)程序員很方便,但它回避了捕獲或指定必要的東西的意圖,并且可能使使用你的類的程序員發(fā)生錯(cuò)誤。

   為什么設(shè)計(jì)者決定強(qiáng)制一個(gè)方法指定所有的在它的范圍內(nèi)可能被拋出的未檢查異常呢?被一個(gè)方法拋出的任何異常都是方法公共編程接口的一部分。方法的調(diào)用者必須知道有關(guān)這個(gè)方法所拋出的異常,以便他們能夠針對(duì)這些異常決定做什么。這些異常是編寫方法的接口差不多,有它們的參數(shù)和返回值。

   接下來你的問題可能是:如果它是這么好的說明了一個(gè)方法的API,包括它能拋出的異常,那么為什么不也指定運(yùn)行時(shí)異常呢?運(yùn)行時(shí)異常描述的問題是一個(gè)設(shè)計(jì)問題的結(jié)果,并且,API的客戶代碼不能期望從出錯(cuò)的地方來恢復(fù)程序執(zhí)行或用一些方法來處理它們。這些問題包括算法異常(例如被零除),指針異常(例如通過一個(gè)空的引用來訪問一個(gè)對(duì)象),以及索引異常(例如試圖通過一個(gè)越界的索引來訪問一個(gè)數(shù)組)。運(yùn)行時(shí)異?赡茉诔绦虻娜魏蔚胤桨l(fā)生,并且在一個(gè)典型的程序中可能有很多,因此,在每個(gè)方法中不得不添加運(yùn)行異常來降低程序的透明度,這樣,編譯器不要求你指定或捕獲運(yùn)行時(shí)異常(盡管你可以)。

   拋出運(yùn)行時(shí)異常(RuntimeException)的一個(gè)公共案例就是在用戶調(diào)用了一個(gè)錯(cuò)誤的方法的時(shí)候。例如,一個(gè)方法檢查它的參數(shù)是否有效,如果一個(gè)參數(shù)是空(null),那么這個(gè)方法就可能拋出一個(gè)NullPointerException異常,這是一個(gè)不檢查異常。

   一般來說,不拋出運(yùn)行時(shí)異常(RuntimeException)或不創(chuàng)建一個(gè)運(yùn)行時(shí)異常(RuntimeException)的子類的原因是:人你不想為指定你的方法所能拋出的異常而操心。

   一個(gè)使用異常的方針是:如果客戶能夠被期望從一個(gè)異常中得到恢復(fù),那么就要使用檢查性異常。如果一個(gè)客戶對(duì)于從異常中恢復(fù)的程序不能做任何事,那么就可以使用不檢查性異常。




標(biāo)簽:Java 異常處理7