這篇文章給大家介紹Java中怎么實(shí)現(xiàn)異常處理,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括拉薩網(wǎng)站建設(shè)、拉薩網(wǎng)站制作、拉薩網(wǎng)頁制作以及拉薩網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,拉薩網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到拉薩省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
在Java語言中,將程序執(zhí)行中發(fā)生的不正常情況稱為“異?!?。(開發(fā)過程中的語法錯(cuò)誤和邏輯錯(cuò)誤不是異常)
Java程序在執(zhí)行過程中所發(fā)生的異常事件可分為兩類:
Error
: Java虛擬機(jī)無法解決的嚴(yán)重問題。如:JVM系統(tǒng)內(nèi)部錯(cuò)誤、資源耗盡等嚴(yán)重情況。比如: StackOverflowError
和OOM。一般不編寫針對(duì)性的代碼進(jìn)行處理。
Exception
:其它因編程錯(cuò)誤或偶然的外在因素導(dǎo)致的一般性問題,可以使用針對(duì)性的代碼進(jìn)行處理。如:
空指針訪問
試圖讀取不存在的文件
網(wǎng)絡(luò)連接中斷
數(shù)組角標(biāo)越界
異常的體系結(jié)構(gòu) * java.lang.Throwable * |-----java.lang.Error:一般不編寫針對(duì)性的代碼進(jìn)行處理。 * |-----java.lang.Exception:可以進(jìn)行異常的處理 * |------編譯時(shí)異常(checked)不會(huì)生成字節(jié)碼文件 * |-----IOException * |-----FileNotFoundException * |-----ClassNotFoundException * |------運(yùn)行時(shí)異常(unchecked,RuntimeException) * |-----NullPointerException//空指針異常 * |-----ArrayIndexOutOfBoundsException//數(shù)組角標(biāo)越界 * |-----ClassCastException//類型轉(zhuǎn)化異常 * |-----NumberFormatException//編碼格式異常 * |-----InputMismatchException//輸入不匹配 * |-----ArithmeticException//算術(shù)異常
java中異常類的繼承關(guān)系
編譯時(shí)異常:執(zhí)行 javac.exe
命令時(shí),可能出現(xiàn)的異常:
指編譯器要求必須處置的異常。即程序在運(yùn)行時(shí)由于外界因素造成的一般性異常。編譯器要求Java程序必須捕獲或聲明所有編譯時(shí)異常對(duì)于這類異常,如果程序不處理,可能會(huì)帶來意想不到的結(jié)果。
運(yùn)行時(shí)異常:執(zhí)行 java.exe
命令時(shí),出現(xiàn)的異常:
指編譯器不要求強(qiáng)制處置的異常。一般是指編程時(shí)的邏輯錯(cuò)誤,是程序員應(yīng)該積極避免其出現(xiàn)的異常。 java. lang. Runtime Exception
類及它的子類都是運(yùn)行時(shí)異常。對(duì)于這類異常,可以不作處理,因?yàn)檫@類異常很普遍,若全處理可能會(huì)對(duì)程序的可讀性和運(yùn)行效率產(chǎn)生影響。
//******************以下是運(yùn)行時(shí)異常*************************** //ArithmeticException @Test public void test6(){ int a = 10; int b = 0; System.out.println(a / b); } //InputMismatchException @Test public void test5(){ Scanner scanner = new Scanner(System.in); int score = scanner.nextInt(); System.out.println(score); scanner.close(); } //NumberFormatException @Test public void test4(){ String str = "123"; str = "abc"; int num = Integer.parseInt(str); } //ClassCastException @Test public void test3(){ Object obj = new Date(); String str = (String)obj; } //IndexOutOfBoundsException @Test public void test2(){ //ArrayIndexOutOfBoundsException // int[] arr = new int[10]; // System.out.println(arr[10]); //StringIndexOutOfBoundsException String str = "abc"; System.out.println(str.charAt(3)); } //NullPointerException @Test public void test1(){ // int[] arr = null; // System.out.println(arr[3]); String str = "abc"; str = null; System.out.println(str.charAt(0)); } //******************以下是編譯時(shí)異常*************************** @Test public void test7(){ // File file = new File("hello.txt"); // FileInputStream fis = new FileInputStream(file); // // int data = fis.read(); // while(data != -1){ // System.out.print((char)data); // data = fis.read(); // } // // fis.close(); }
**過程一:"拋"**程序在正常執(zhí)行的過程中,一旦出現(xiàn)異常,就會(huì)在異常代碼處生成一個(gè)對(duì)應(yīng)異常類的對(duì)象。并將此對(duì)象拋出。一旦拋出對(duì)象以后,其后的代碼就不再執(zhí)行。
關(guān)于異常對(duì)象的產(chǎn)生:
系統(tǒng)自動(dòng)生成的異常對(duì)象
手動(dòng)的生成一個(gè)異常對(duì)象,并拋出(throw
)
**過程二:"抓"**可以理解為異常的處理方式:① try-catch-finally
② throws
try{ //可能出現(xiàn)異常的代碼 }catch(異常類型1 變量名1){ //處理異常的方式1 }catch(異常類型2 變量名2){ //處理異常的方式2 }catch(異常類型3 變量名3){ //處理異常的方式3 } .... finally{ //一定會(huì)執(zhí)行的代碼 }
使用說明:
finally
是可選的。
使用 try
將可能出現(xiàn)異常代碼包裝起來,在執(zhí)行過程中,一旦出現(xiàn)異常,就會(huì)生成一個(gè)對(duì)應(yīng)異常類的對(duì)象,根據(jù)此對(duì)象的類型,去 catch
中進(jìn)行匹配
一旦 try
中的異常對(duì)象匹配到某一個(gè) catch
時(shí),就進(jìn)入 catch
中進(jìn)行異常的處理。一旦處理完成,就跳出當(dāng)前的 try-catch
結(jié)構(gòu)(在沒寫 finally
的情況。繼續(xù)執(zhí)行其后的代碼)
catch
中的異常類型如果沒子父類關(guān)系,則誰聲明在上,誰聲明在下無所謂;catch
中的異常類型如果滿足子父類關(guān)系,則要求子類一定聲明在父類的上面。否則會(huì)報(bào)錯(cuò)
常用的異常對(duì)象處理的方式: ① String getMessage()
② printStackTrace()
在try
結(jié)構(gòu)中聲明的變量,再出了 try
結(jié)構(gòu)以后,就不能再被調(diào)用
try-catch-finally
結(jié)構(gòu)可以嵌套
如何看待代碼中的編譯時(shí)異常和運(yùn)行時(shí)異常?
使用 try-catch-finally
處理編譯時(shí)異常,是得程序在編譯時(shí)就不再報(bào)錯(cuò),但是運(yùn)行時(shí)仍可能報(bào)錯(cuò)。相當(dāng)于我們使用 try-catch-finally
將一個(gè)編譯時(shí)可能出現(xiàn)的異常,延遲到運(yùn)行時(shí)出現(xiàn)。
開發(fā)中,由于運(yùn)行時(shí)異常比較常見,所以我們通常就不針對(duì)運(yùn)行時(shí)異常編寫 try-catch-finally
了。但是針對(duì)于編譯時(shí)異常,一定要考慮異常的處理。
finally
是可選的
finally
中聲明的是一定會(huì)被執(zhí)行的代碼。即使catch中又出現(xiàn)異常了,try
中包含 return
語句,或者catch
中 return
包含語句等情況,finally
中的代碼也會(huì)被執(zhí)行。
像數(shù)據(jù)庫(kù)連接、輸入輸出流、網(wǎng)絡(luò)編程Socket等資源,JVM是不能自動(dòng)的回收的,我們需要自己手動(dòng)的進(jìn)行資源的釋放。此時(shí)的資源釋放的代碼,就需要聲明在 finally
中。
throws + 異常類型
寫在方法的聲明處。指明此方法執(zhí)行時(shí),可能會(huì)拋出的異常類型。 一旦當(dāng)方法體執(zhí)行時(shí),出現(xiàn)異常,仍會(huì)在異常代碼處生成一個(gè)異常類的對(duì)象,此對(duì)象滿足 throws
后異常類型時(shí),就會(huì)被拋出。異常代碼后續(xù)的代碼,就不再執(zhí)行!
try-catch-finally
真正的將異常給處理掉了。 throws
的方式只是將異常拋給了方法的調(diào)用者。并沒真正將異常處理掉。
如果父類中被重寫的方法沒 throws
方式處理異常,則子類重寫的方法也不能使用 throws
,意味著如果子類重寫的方法中異常,必須使用 try-catch-finally
方式處理。
執(zhí)行的方法a中,先后又調(diào)用了另外的幾個(gè)方法,這幾個(gè)方法是遞進(jìn)關(guān)系執(zhí)行的。我們建議這幾個(gè)方法使用throws
的方式進(jìn)行處理。而執(zhí)行的方法a可以考慮使用 try-catch-finally
方式進(jìn)行處理。
補(bǔ)充: 方法重寫的規(guī)則之一: 子類重寫的方法拋出的異常類型不大于父類被重寫的方法拋出的異常類型
在程序執(zhí)行中,除了自動(dòng)拋出異常對(duì)象的情況之外,我們還可以手動(dòng)的 throw
一個(gè)異常類的對(duì)象。
throw
和 throws
區(qū)別: throw
表示拋出一個(gè)異常類的對(duì)象,生成異常對(duì)象的過程。聲明在方法體內(nèi)。 throws
屬于異常處理的一種方式,聲明在方法的聲明處。
class Student{ private int id; public void regist(int id) throws Exception { if(id > 0){ this.id = id; }else{ //手動(dòng)拋出異常對(duì)象 // throw new RuntimeException("您輸入的數(shù)據(jù)非法!"); // throw new Exception("您輸入的數(shù)據(jù)非法!"); throw new MyException("不能輸入負(fù)數(shù)"); } } @Override public String toString() { return "Student [id=" + id + "]"; } }
繼承于現(xiàn)的異常結(jié)構(gòu):RuntimeException 、Exception
提供全局常量:serialVersionUID
(對(duì)類的唯一標(biāo)識(shí))
提供重載的構(gòu)造器
public class MyException extends Exception{ static final long serialVersionUID = -7034897193246939L; public MyException(){ } public MyException(String msg){ super(msg); } }
關(guān)于Java中怎么實(shí)現(xiàn)異常處理就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
標(biāo)題名稱:Java中怎么實(shí)現(xiàn)異常處理
分享路徑:http://m.newbst.com/article0/gdeioo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、自適應(yīng)網(wǎng)站、網(wǎng)站內(nèi)鏈、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站制作、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)