這篇“Java中如何處理異常類型”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Java中如何處理異常類型”文章吧。
成都創(chuàng)新互聯(lián)主要從事做網(wǎng)站、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)高明,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
程序運(yùn)行時(shí),發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。異常發(fā)生時(shí),是任程序自生自滅,立刻退出終止。在Java中即,Java在編譯或運(yùn)行或者運(yùn)行過(guò)程中出現(xiàn)的錯(cuò)誤。
Java提供了更加優(yōu)秀的解決辦法:異常處理機(jī)制。
異常處理機(jī)制能讓程序在異常發(fā)生時(shí),按照代碼的預(yù)先設(shè)定的異常處理邏輯,針對(duì)性地處理異常,讓程序盡最大可能恢復(fù)正常并繼續(xù)執(zhí)行,且保持代碼的清晰。
Java中的異??梢允呛瘮?shù)中的語(yǔ)句執(zhí)行時(shí)引發(fā)的,也可以是程序員通過(guò)throw 語(yǔ)句手動(dòng)拋出的,只要在Java程序中產(chǎn)生了異常,就會(huì)用一個(gè)對(duì)應(yīng)類型的異常對(duì)象來(lái)封裝異常,JRE就會(huì)試圖尋找異常處理程序來(lái)處理異常。
異常指在運(yùn)行時(shí)期發(fā)生的不正常情況。
在java中用類的形式對(duì)不正常情況進(jìn)行了描述和封裝對(duì)象。
描述不正常情況的類,就成為異常類。
將正常代碼和問(wèn)題處理代碼分離,提高閱讀性。
其實(shí)異常就是java通過(guò)面向?qū)ο蟮乃枷雽?wèn)題封裝成了對(duì)象,用異常類對(duì)其進(jìn)行描述。
兩大類:
hrowable:可拋出的異常,無(wú)論是error還是exception,問(wèn)題發(fā)生就應(yīng)該可以拋出,讓調(diào)用者知道并且處理。
該體系的特點(diǎn)就是在于Throwable及其所有的子類都具有可拋性。
可拋性到底指的是什么?怎么體現(xiàn)可拋性呢?
通過(guò)兩個(gè)關(guān)鍵字來(lái)體現(xiàn)的。
throws throw 凡是可以被這兩個(gè)關(guān)鍵字所操作的類和對(duì)象都具有可拋性。
子類1 一般不可處理的?!狤rror
特點(diǎn):是由jvm拋出的嚴(yán)重性問(wèn)題,這種問(wèn)題發(fā)生一般不針對(duì)性處理,直接修改程序。
子類2)可以處理的?!狤xception,問(wèn)題拋給調(diào)用者,誰(shuí)用拋給誰(shuí)。
特點(diǎn):子類后綴名都是用其父類名作為后綴名,閱讀性很強(qiáng)!
范例:比如自定義一個(gè)負(fù)數(shù)角標(biāo)的異常,使用面向?qū)ο笏枷敕庋b成對(duì)象。
注意:如果讓一個(gè)類稱為異常類,必須要繼承異常類。因?yàn)橹挥挟惓sw系的子類才具有可拋性。
class FuShuIndex extends Exception{ //構(gòu)造函數(shù) 和類名一樣 FuShuIndex(){ } //定義一個(gè)帶參數(shù)的構(gòu)造函數(shù) FuShuIndex(String msg){ //調(diào)用Exception中的帶參數(shù)異常函數(shù) super(msg); } } 主函數(shù) throws FuShuIndex:{ int[] arr = new int[3]; method(arr,-7); } public static int method(int[] arr,int index) throws arrIndexexception { if (index<0){ throw new arrIndexexception("數(shù)組的角標(biāo)不能為負(fù)數(shù)"); } return arr[index]; }
編譯時(shí)被檢測(cè)異常還要是Exception和其子類都是,除了特殊子類RuntimeException體系未處理即編譯失敗!
這種問(wèn)題一旦出現(xiàn),希望在編譯時(shí)就進(jìn)行檢測(cè),讓這種問(wèn)題有相應(yīng)的處理方式,這樣的問(wèn)題都可以針對(duì)性處理。
編譯時(shí)不被檢測(cè)異常(運(yùn)行時(shí)異常):RuntimeException和其子類
可處理可不處理,編譯都可以通過(guò),運(yùn)行時(shí)會(huì)檢測(cè)!
這種問(wèn)題的發(fā)生,無(wú)法讓功能繼續(xù),運(yùn)算無(wú)法運(yùn)行,更多因?yàn)檎{(diào)用的原因?qū)е拢蛘咭l(fā)了內(nèi)部狀態(tài)的改變導(dǎo)致的。這種問(wèn)題一般不處理,直接編譯通過(guò),在運(yùn)行時(shí),讓調(diào)用者時(shí)程序強(qiáng)制停止,讓調(diào)用者對(duì)代碼進(jìn)行修正。
throws和throw的區(qū)別:
throws使用在函數(shù)上 ————申明
throw使用在函數(shù)內(nèi),可以拋出多個(gè),用逗號(hào)隔開。 ————拋出
throws拋出的是異常類,可以拋出多個(gè)。
throw拋出的是異常對(duì)象。
這是可以對(duì)異常進(jìn)行針對(duì)性處理的方式。
格式:
try{ //需要被檢測(cè)異常的代碼 } catch(異常類 變量)//該變量用于接收發(fā)生的異常對(duì)象{ //處理異常代碼 } finally{ //一定會(huì)被執(zhí)行的代碼 }
范例
class FuShuIndex extends Exception{ //構(gòu)造函數(shù) 和類名一樣 FuShuIndex(){ } //定義一個(gè)帶參數(shù)的構(gòu)造函數(shù) FuShuIndex(String msg){ //調(diào)用Exception中的帶參數(shù)異常函數(shù) super(msg); } }
主函數(shù):無(wú)需throws拋出,下面我們自己捕獲異常
{ int[] arr = new int[3]; try{ method(arr,-7); }catch(arrIndexexception a){ a.printStackTrace();//jvm默認(rèn)的異常處理機(jī)制就是調(diào)用異常對(duì)象的這個(gè)方法。 System.out.println("數(shù)組的角標(biāo)異常!?。?);//自定義捕獲后打印的信息 System.out.println(a.toString());//打印該異常對(duì)象的信息 System.out.println(a.getMessage());//獲取我們自定義拋出所定義的信息 } } public static int method(int[] arr,int index) throws arrIndexexception { if (index<0){ throw new arrIndexexception("數(shù)組的角標(biāo)不能為負(fù)數(shù)"); } return arr[index]; }
一個(gè)try對(duì)應(yīng)多個(gè)catch:
多catch情況下,父類的catch要放在最下面,否則編譯為空。
函數(shù)內(nèi)部如果拋出了需要檢測(cè)的異常,那么函數(shù)上必須申明,或者必須在函數(shù)內(nèi)用try catch捕捉,否則編譯失敗。
如果調(diào)用到了申明異常的函數(shù),要么try catch 或者 throws ,否則編譯失敗。
什么時(shí)候catch?什么時(shí)候throws?
功能內(nèi)容可以解決,用catch。
解決不了,用throws告訴調(diào)用者,由調(diào)用者解決。
一個(gè)功能如果拋出了多個(gè)異常,那么調(diào)用時(shí),必須有對(duì)應(yīng)的多個(gè)catch來(lái)進(jìn)行針對(duì)性處理。
內(nèi)部有幾個(gè)需要檢測(cè)的異常,就拋幾個(gè)異常,拋出幾個(gè)就catch幾個(gè)異常。
通常用于關(guān)閉(釋放)資源。必須要執(zhí)行。除非jvm虛擬機(jī)掛了。
范例:出門玩,必須關(guān)門,所以將關(guān)門這個(gè)動(dòng)作放在finally里面,必須執(zhí)行。
凡是涉及到關(guān)閉連接等操作,要用finally代碼塊來(lái)釋放資源。
try catch finally 代碼塊組合特點(diǎn):
try catch finally:當(dāng)有資源需要釋放時(shí),可以定義finally
try catch(多個(gè)):當(dāng)沒有資源需要釋放時(shí),可以不定義finally
try finally:異常處理不處理我不管,但是我得關(guān)閉資源,因?yàn)橘Y源是我開的,得在內(nèi)部關(guān)掉資源。
范例:
try{ //連接數(shù)據(jù)庫(kù) } //沒有catch意思不處理異常,只單純的捕獲異常 finally{ //關(guān)閉連接 }
老師用電腦講課范例:
電腦類:
public class Computer { private int state = 2; public void run() throws lanpingExcption,maoyanExcption{ if (state == 1){ throw new lanpingExcption("電腦藍(lán)屏啦~"); }else if (state == 2){ throw new maoyanExcption("電腦冒煙啦~"); } System.out.println("電腦啟動(dòng)"); } public void chongqi(){ state = 0; System.out.println("重啟電腦!"); } }
老師類:
public class Teacher { private String name; private Computer computer; Teacher(String name){ this.name = name; computer = new Computer(); } void teach() throws maoyanExcption{ try { computer.run(); System.out.println(this.name + "開始用電腦講課了"); } catch (lanpingExcption l) { l.printStackTrace(); computer.chongqi(); teach();//重啟后再次講課 } catch (maoyanExcption m) { m.printStackTrace(); test(); throw m; } } public void test(){ System.out.println("大家自己練習(xí)去~"); } }
藍(lán)屏異常類:
public class lanpingExcption extends Exception{ lanpingExcption (String msg){ super(msg); } }
冒煙異常類:
public class maoyanExcption extends Exception { maoyanExcption (String msg){ super(msg); } }
主函數(shù):
public class Testmain { public static void main (String[] args){ Teacher teacher = new Teacher("丁老師"); try { teacher.teach(); } catch (maoyanExcption m) { //m.printStackTrace(); System.out.println("。。。。。"); } } }
子類在覆蓋父類方法時(shí),父類的方法如果拋出了異常,那么子類的方法只能拋出父類的異?;蛘咴摦惓5淖宇悺?/p>
如果父類拋出多個(gè)異常,那么子類只能拋出父類異常的子集。
子類覆蓋父類,只能拋出父類的異?;蛘咦宇悺?/p>
如果父類的方法沒有拋出異常,子類覆蓋時(shí)絕對(duì)不能拋。
以上就是關(guān)于“Java中如何處理異常類型”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。