java基礎(chǔ)詳細筆記之異常處理
異常概述
在Java中,這種在程序運行時可能出現(xiàn)的一些錯誤稱為異常。異常是一個在程序執(zhí)行期間發(fā)生的事件,它中斷了正在執(zhí)行的成宿的正常指令流。
視頻筆記:
Java程序執(zhí)行時遇到的異常:
- java.lang.Error:一般不編寫針對性的代碼進行處理
- Java.lang.Exception:可以進行異常處理
- 編譯時異常(checked)和運行時異常(unchecked)
1.Error:java虛擬機無法解決的嚴重問題。如:JVM系統(tǒng)內(nèi)部錯誤
2.Exception:其他因編程錯誤或偶然的外在因素導致的一般性問題,可以使用針對性的代碼 進行處理。例如:空指針訪問,試圖讀取不存在的文件,網(wǎng)絡連接中斷,數(shù)組角標越界
下面看最常見的將0做除數(shù)的時候
public class test { public static void main(String[] args) { int a=3/0; System.out.println(a); } }
程序運行的結(jié)果報告發(fā)生了算數(shù)異常ArithmeticException,系統(tǒng)不在執(zhí)行下去,提前結(jié)束。這種情況就是所說的異常。
public class test { public static void main(String[] args) { main(args); } }
棧溢出(main里面還調(diào)main(args))
public class test { public static void main(String[] args) { Integer [] a=new Integer[1024*1024*1024]; } }
堆溢出(OutOfMemoryError)
書本內(nèi)容:
Java語言是一門面向?qū)ο蟮木幊陶Z言,因此異常在Java語言中也是作為類的實例的形式出現(xiàn)的,當某一方法發(fā)生錯誤時,這個方法會創(chuàng)建一個對象,并且把它傳遞給正在運行的系統(tǒng)。這個對象就是異常對象。通過異常處理機制,可以將非正常情況下的處理代碼與程序的主邏輯分離,即在編寫代碼主流程的同時在其他地方處理異常。
常見異常的舉例
空指針異常NullPointerException
public class test { public static void main(String[] args) { int a[]=null; System.out.println(a[5]); } }
數(shù)組角標越界異常ArrayIndexOutOfBoundsException
public class test { public static void main(String[] args) { int a[]=new int[5]; System.out.println(a[5]); } }
異常的拋出與捕捉
為了保證程序有效地執(zhí)行,需要對拋出的異常進行相應的處理。在Java中,如果某個方法拋出異常,既可以在當前方法中進行捕捉,而后處理該異常,也可以將異常向上拋出,交由方法調(diào)用者來處理。
拋出異常
異常拋出后,如果不做任何處理,程序就會被終止。
例如,將一個字符串轉(zhuǎn)換為整型,可以通過Integer類的parseInt()方法來實現(xiàn)。但如果該字符串不是數(shù)字形式,parseInt()方法就會拋出異常,程序?qū)⒃诔霈F(xiàn)異常的位置終止,不在執(zhí)行下面語句
public class test { public static void main(String[] args) { String str="abc"; System.out.println(str); int a=Integer.parseInt("20L"); System.out.println(a); } }
NumberFormatException異常,abc以及輸出,只是后面語句自身問題,導致代碼終止
拋出異常,其后的代碼不執(zhí)行
捕捉異常
Java語言的異常捕獲結(jié)構(gòu)由try,catch,finally3部分組成。其中,try語句塊存放的是可能發(fā)生異常的Java語句;catch語句塊在try語句塊之后,用來激發(fā)被捕獲的異常;final語句塊是異常結(jié)構(gòu)的最后執(zhí)行部分,無論try語句塊中的代碼如何退出,都將執(zhí)行finally語句塊
try{ //代碼塊 } catch(exception1 e)//(異常類型,變量名) { //對exception1的處理 } catch(exception2 e)//(異常類型,變量名) { //對exception2的處理 } finally{ //代碼塊(一定會執(zhí)行的代碼) }
模板如上
public class test { public static void main(String[] args) { String str="abc"; System.out.println(str); try { int a=Integer.parseInt(str); System.out.println("猜猜看"); } catch(Exception e) { System.out.println("出現(xiàn)異常啦,不要慌"); } System.out.println("你看,都說問題不大啦"); } }
用e.printStackTrace();語句輸出異常性質(zhì)后得到
視頻筆記:
- finally是可選的
- 使用try將可能出現(xiàn)的異常代碼包裝起來,在執(zhí)行過程中,一旦出現(xiàn)異常,就會生成一個對應異常類的對象,根據(jù)此對象的類型,去catch中進行匹配——比如我們上述代碼中的Exception e寫為NumberFormatException e,與其對應
- 一旦try中的異常對象匹配到某一個catch時,就進入catch中進行異常處理。一旦處理完成,就跳出當前try——catch結(jié)構(gòu)(若此時無finally)。繼續(xù)執(zhí)行其后的代碼
- catch中的異常類型如果滿足子父類關(guān)系,則要求子類一定要聲明在父類的上面。
- 在try結(jié)構(gòu)中聲明的變量,在出了try結(jié)構(gòu)以后,就不能再被調(diào)用
- 使用該結(jié)構(gòu)處理異常時,編譯時沒有報錯,但是運行時仍有可能報錯,相當于將異常延長到運行時出現(xiàn);開發(fā)中,由于運行時異常比較常見,所以我們通常不針對運行時異常編寫try-catch-finally
finally語句塊
一下四種特殊情況下,finally塊不會被執(zhí)行:
- 在finally語句塊中發(fā)生了異常
- 在前面的代碼中使用了System.exit()退出程序
- 程序所在的線程死亡
- 關(guān)閉CPU
這里對比一下發(fā)現(xiàn)第二個圖沒寫finally但沒影響結(jié)果的體現(xiàn)
finally是可選的
finally中聲明的是一定會被執(zhí)行的代碼,即使catch中又出現(xiàn)異常了,try中有return語句,catch中有return語句等情況
在方法中拋出異常
使用throws關(guān)鍵字拋出異常
throws關(guān)鍵字通常被應用在聲明方法時,用來指定方法可能拋出的異常。多個異??墒褂枚禾柗指?。
public class test { static void p()throws NegativeArraySizeException{ //定義方法并拋出NegativeArraySizeException異常 int[] a=new int[-4]; } public static void main(String[] args) { try { p(); } catch(NegativeArraySizeException e) { System.out.println("p()方法拋出的異常"); } } }
筆記:如果是Error類,RuntimeException類或他們的子類,可以不使用throws關(guān)鍵字來聲明要拋出的異常,編譯仍能順利通過,但在運行時會被系統(tǒng)拋出。 ""
"throws+異常類型"寫在方法的聲明處。指明此方法執(zhí)行時,可能會拋出異常類型。一旦當方法體執(zhí)行時,出現(xiàn)異常,仍會在異常代碼處生成一個異常類的對象,此對象滿足throws后異常類型時,就會被拋出
使用throw關(guān)鍵字拋出異常(自定義異常)
throw關(guān)鍵字通常用于方法體中,并且拋出一個異常對象。程序在執(zhí)行到throw語句時立即終止,它后面的語句都不執(zhí)行。通過throw拋出異常后,如果想在上一級代碼中捕獲并處理異常,則需要在拋出異常的方法中使用throws關(guān)鍵字在方法的聲明中指明要拋出的異常;如果要捕獲throw拋出的異常,則必須使用try-catch語句塊
public class test extends Exception { String name; public test(String errorname) { name=errorname; } public String getName() { return name; } } public class captor{ static int q(int x,int y)throws test{ if(y<0) { throw new test("除數(shù)不能是負數(shù)"); } return x/y; } public static void main(String[] args) { try { int result=q(3,-1); }catch(test e) { System.out.println(e.getName()); }catch(ArithmeticException e) { System.out.println("除數(shù)不能為0"); }catch(Exception e) { System.out.println("產(chǎn)生了其他異常"); } } }
異常的使用原則
Java異常強制用戶去考慮程序的強健性和安全性。異常處理不應來控制程序的正常流程,其主要作用是捕獲程序在運行時發(fā)生的異常并進行相應的處理。編寫代碼處理某個方法可能出現(xiàn)的異常時,可遵循一下原則:
- 在當前方法聲明中使用try-catch語句捕獲異常
- 一個方法被覆蓋時,覆蓋它的方法必須拋出相同的異?;虍惓5淖宇?/li>
- 如果父類拋出多個異常,則覆蓋方法必須拋處那些異常的一個子集,不能拋出新異常
總結(jié)
到此這篇關(guān)于java基礎(chǔ)詳細筆記之異常處理的文章就介紹到這了,更多相關(guān)java異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot基于過濾器和內(nèi)存實現(xiàn)重復請求攔截功能
這篇文章主要介紹了SpringBoot基于過濾器和內(nèi)存實現(xiàn)重復請求攔截,這里我們使用過濾器的方式對進入服務器的請求進行過濾操作,實現(xiàn)對相同客戶端請求同一個接口的過濾,需要的朋友可以參考下2023-01-01Java實現(xiàn)JDBC向數(shù)據(jù)庫批量插入
在Java項目中可能會出現(xiàn)大量向數(shù)據(jù)庫中插入的情況,本文主要介紹了Java實現(xiàn)JDBC向數(shù)據(jù)庫批量插入,具有一定的參考價值,感興趣的可以了解一下2023-09-09Java中JSONObject與JSONArray的使用區(qū)別詳解
這篇文章主要介紹了Java中JSONObject與JSONArray的使用區(qū)別詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11RxJava2.x+ReTrofit2.x多線程下載文件的示例代碼
本篇文章主要介紹了RxJava2.x+ReTrofit2.x多線程下載文件的示例代碼,具有一定的參考價值,有興趣的可以了解一下2017-09-09