1. 程式人生 > >異常的捕獲及處理

異常的捕獲及處理

height 自定義異常 basic 數字 ... 返回值 如果 pack java

作者: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語句中的返回值無關了

異常的捕獲及處理