異常的捕獲及處理
作者:gqk:
1、 異常的產生原因及處理格式
2、 異常的標準使用方式
3、 throw 和 throws 關鍵字的作用
認識異常:保證程序不會因出現異常而終止,必須對有可能出現異常的代碼進行處理
現實生活中的異常:
處理異常:上班的途中遇到異常後,我們可定要對這些異常進行處理,兩種方式,
一:自己解決
二:打電話讓讓別人解決
在 Java 中使用如下的語法進行異常的處理:
try{ 可能出現異常的語句 ; } catch(異常類型 異常對象){ 處理異常 ; } catch(異常類型 異常對象){ 處理異常 ; } ... finally{ 異常處理的統一出口 ; }
處理異常
package demo; public class DemoExecption { public static void main(String[] args) { int num1 = 0; int num2 = 10; int result = 0; System.out.println("==============計算開始=============="); try { result = num2/num1; } catch (ArithmeticException e) { System.out.println("異常信息為:"+e.getMessage()); } System.out.println(result); System.out.println("==============計算結束=============="); } }
這個時候由於程序中增加了異常的處理機制,所以,此時的程序可以正常的執行完畢,當然,在異常的處理中也可 以加入 finally作為統一的出口操作
package demo; public class DemoExecption { public static void main(String[] args) { int num1 = 0; int num2 = 10; int result = 0; System.out.println("==============計算開始=============="); try { result = num2/num1; } catch (ArithmeticException e) { System.out.println("異常信息為:"+e.getMessage()); }finally { System.out.println("不管有沒有都會去執行"); } System.out.println(result); System.out.println("==============計算結束=============="); } }
但是以上的程序並不靈活,因為所有的操作的數字都是固定好的了,那麽下面希望可以讓這個數字由用戶自己決定, 所以,通過初始化參數傳遞所需要計算的數字。
註意:考慮異常,第一個數學運算異常,第二個數組下標異常,第三個數字格式異常
考慮:如果異常有很多的話,我們不能確定應該怎麽辦:
異常的處理結構:
Error:表示jvm出錯,還沒有運行到程序上,所以一般不需要處理;
Execption:在程序中發生的異常,一般都應該進行處理
從之前學習過的對象多態性中可以發現,任何的子類對象都可以自動向父類對象轉換。 那麽,肯定所有的異常類的操作都可以通過 Exception 進行接收。
但是,如果一個 try 語句之中同時有多個 catch 的話一定要記住的是,捕獲範圍小的異常要放在捕獲範圍大的異常之 前,一般在開發中為了簡單起見,大部分的異常都直接使用 Exception 接收即可。
異常的處理流程:
在異常的處理中基本上都是采用如下的過程完成的:
1、 每當一個異常產生之後,實際上都會自動生成一個異常類的實例化對象,如果此時編寫了異常處理語句的 話,則進行異常的處理,如果沒有的話,則交給JVM 進行處理。
2、 使用了 try 捕獲異常之後,將自動與 catch 中的異常類型相匹配,如果匹配成功,則表示可以使用此 catch 處理異常,如果都沒有匹配成功的,則不能處理。
3 、程序中不管是否出現了異常,如果存在了 finally語句,都要執行此語句的代碼
throws 關鍵字:(拋出異常)
throws 關鍵字主要是用在方法的聲明上,表示一個方法不處理異常,而交給被調用處進行處理。
案例:????
throws 關鍵字不光可以在普通的方法上使用,主方法上也可以使,如果在主方法上使用的話就表示一旦出現了異常之 後,繼續向上拋,表示由JVM 進行處理了。
throw 關鍵字
throw 關鍵字是在程序中人為的拋出一個異常對象
public class ExpDemo09 { public static void main(String args[]) { try{
throw new Exception("拋著玩的!") ; }catch(Exception e){ e.printStackTrace() ; } } };
(自定義異常):
RuntimeException 和 Exception:
· public static int parseInt(String s) throws NumberFormatException 本方法中存在了 throws 關鍵字的聲明,理論上講,在調用時必須進行異常處理,但是從實際的使用中可以發現,即 使不使用 try…catch 處理也沒問題。
package demo; public class DemoExecption { public static void main(String[] args) { Integer.parseInt("10"); } }
要想解釋這個問題,必須觀察 NumberFormatException 異常的繼承結構:
可以發現 NumberFormatException 是 RuntimeException 的子類,那麽實際上在程序中,Java 為了異常的處理方便,定 義出了一個特殊的異常類 —— RuntimeException,一旦拋出的異常是此類或者是此類的子類的話,那麽可以不用進行異 常處理的操作,如果不做任何異常處理的話,則一旦出現了異常之後將交給被調用處進行處理。
RuntimeException 和 Exception 的區別,Exception 必須處理,而 RuntimeException 可以不用處理
異常處理的標準格式
之前的異常的處理語句:try…catch…finally、throw、throws 實際上在開發中是要一起使用的,以下面的程序為例。
編寫一個除法的操作,要求在計算開始的時候輸出“開始計算”的信息,在計算完成之後,輸出“結束計算”的信 息,而且只要是出現了異常一定要交給被調用處處理。
總結:
1、 異常的處理就是保證程序可以正常的執行完畢
2、 異常處理的標準格式及流程
3、 Exception 和 RuntimeException 的區別
考慮一下代碼
public static int testBasic(){ int i = 1; try{ i++; System.out.println("try block, i = "+i); return i; }catch(Exception e){ i ++; System.out.println("catch block i = "+i); return i; }finally{ i = 10; System.out.println("finally block i = "+i); } }
代碼順序執行從try到finally,由於finally是無論如何都會執行的,所以try裏的語句並不會直接返回。在try語句的return塊中,return返回的引用變量並不是try語句外定義的引用變量i,而是系統重新定義了一個局部引用i’,這個引用指向了引用i對應的值,也就是2,即使在finally語句中把引用i指向了值10,因為return返回的引用已經不是i,而是i‘,所以引用i的值和try語句中的返回值無關了
異常的捕獲及處理