您好,登錄后才能下訂單哦!
Java異常處理通過5個關鍵字try、catch、throw、throws、finally進行管理。
基本過程是用try語句塊包住要監視的語句,如果在try語句塊內出現異常,則異常會被拋出,
你的代碼在catch語句塊中可以捕獲到這個異常并做處理;還有以部分系統生成的異常在Java運行時自動拋出。
你也可以通過throws關鍵字在方法上聲明該方法要拋出異常,然后在方法內部通過throw拋出異常對象。
?對于可能出現異常的代碼,有兩種處理辦法:
第一、在方法中用try...catch語句捕獲并處理異常,catch語句可以有多個,用來匹配多個異常。例如:
public void p(int x){
?try{
? ...
?}catch(Exception e){
? ...
?}finally{
? ...
?}
}
?
第二、對于處理不了的異常或者要轉型的異常,在方法的聲明處通過throws語句拋出異常。例如:
public void test1() throws MyException{
?...
?if(....){
? throw new MyException();
?}
}?
---------------------------------------------------------------------------------------------------------------------------------------
finally語句塊會在方法執行return之前執行,
package test;
?
public class Test {
?
?/**
? * @param args
? * @throws Exception?
? */
?public static void main(String[] args) throws Exception {??
? System.out.println(Test.test());
?}
?
?public static boolean test(){
? boolean flag = true;
? System.out.println("Hello World!!!");?
? ? ?try{?
? ? ? System.out.println(1/0); //第一種情況
?
? ? ? System.out.println(1/1); //第2種情況
? ? ? flag = false;
? ? ?}catch(ArithmeticException e){?
? ? ? System.out.println("除數為0!");?
? ? ? throw e;
? ? ?}finally{
? ? ? System.out.println("finally中的語句");
? ? ?}
? ? ?return flag;
?}
?
}
執行結果:
//第一種情況
Hello World!!!
Exception in thread "main" java.lang.ArithmeticException: / by zero
?at test.Test.test(Test.java:46)
?at test.Test.main(Test.java:37)
除數為0!
finally中的語句
//第二種情況
Hello World!!!
1
finally中的語句
false
-----------------------------------------------------------------------------------------------------------------------------
如果每個方法都是簡單的拋出異常,那么在方法調用方法的多層嵌套調用中,Java虛擬機會從出現異常的方法代碼塊中往回找,
直到找到處理該異常的代碼塊為止。然后將異常交給相應的catch語句處理。如果Java虛擬機追溯到方法調用棧最底部main()方法時,
如果仍然沒有找到處理異常的代碼塊,將按照下面的步驟處理:
? ? ? ? 第一、調用異常的對象的printStackTrace()方法,打印方法調用棧的異常信息。
? ? ? ? 第二、如果出現異常的線程為主線程,則整個程序運行終止;如果非主線程,則終止該線程,其他線程繼續運行。
? ? ? ? 通過分析思考可以看出,越早處理異常消耗的資源和時間越小,產生影響的范圍也越小。因此,不要把自己能處理的異常也拋給調用者。
? ? ? ? 還有一點,不可忽視:finally語句在任何情況下都必須執行的代碼,這樣可以保證一些在任何情況下都必須執行代碼的可靠性。
比如,在數據庫查詢異常的時候,應該釋放JDBC連接等等。finally語句先于return語句執行,而不論其先后位置,也不管是否try塊出現異常。
finally語句唯一不被執行的情況是方法執行了System.exit()方法。System.exit()的作用是終止當前正在運行的 Java 虛擬機。
finally語句塊中不能通過給變量賦新值來改變return的返回值,也建議不要在finally塊中使用return語句,沒有意義還容易導致錯誤。
? ? ? ? 最后還應該注意一下異常處理的語法規則:
? ? ? ? 第一、try語句不能單獨存在,可以和catch、finally組成 try...catch...finally、try...catch、try...finally三種結構,catch語句可以有一個或多個,
finally語句最多一個,try、catch、finally這三個關鍵字均不能單獨使用。
? ? ? ? 第二、try、catch、finally三個代碼塊中變量的作用域分別獨立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。
? ? ? ? 第三、多個catch塊時候,Java虛擬機會匹配其中一個異常類或其子類,就執行這個catch塊,而不會再執行別的catch塊。
? ? ? ? 第四、throw語句后不允許有緊跟其他語句,因為這些沒有機會執行。
? ? ? ? 第五、如果一個方法調用了另外一個聲明拋出異常的方法,那么這個方法要么處理異常,要么聲明拋出。?
? ? ? ? 那怎么判斷一個方法可能會出現異常呢?一般來說,方法聲明的時候用了throws語句,方法中有throw語句,方法調用的方法聲明有throws關鍵字。
? ? ? ? throw和throws關鍵字的區別
? ? ? ? throw用來拋出一個異常,在方法體內。語法格式為:throw 異常對象。
? ? ? ? throws用來聲明方法可能會拋出什么異常,在方法名后,語法格式為:throws 異常類型1,異常類型2...異常類型n。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。