Java異常處理及異常機制介紹

來源:互聯網
上載者:User

(1)什麼是異常
      當出現程式無法控制的外部環境問題(使用者提供的檔案不存在,檔案內容損壞,網路不可用...)時,JAVA就會用異常對象來描述。
JAVA中用2種方法處理異常:
1.在發生異常的地方直接處理;
2.將異常拋給調用者,讓調用者處理。

JAVA異常可分為3種:
  A,檢查性異常:java.lang.Exception.檢查性異常------程式正確,但因為外在的環境條件不滿足引發。例如:使用者錯誤及I/O問題----程式試圖開啟一個並不存在的遠程Socket連接埠。這不是程式本身的邏輯錯誤,而很可能是遠程機器名字錯誤(使用者拼字錯誤)。JAVA編譯器強制要求處理這類異常,如果不捕獲這類異常,程式將不能被編譯。
  B,運行期異常:java.lang.RuntimeException.運行期異常------這意味著程式存在bug,如數組越界,0被除,入參不滿足規範.....這類異常需要更改程式來避免,JAVA編譯器強制要求處理這類異常。

    C,錯誤:java.lang.Error.錯誤------一般很少見,也很難通過程式解決。它可能源於程式的bug,但一般更可能源於環境問題,如記憶體耗盡。錯誤在程式中無須處理,而由運行環境處理。

      頂層是java.lang.Throwable類,檢查性異常,運行期異常,錯誤都是這個類的子孫類。java.lang.Exception和java.lang.Error繼承自java.lang.Throwable,而java.lang.RuntimeException繼承自java.lang.Exception

(2)如何處理異常?
       A,try...catch 。程式運行產生異常時,將從異常發生點中斷程式並向外拋出異常資訊。

說明:ArithmeticException和ArrayIndexOutOfBoundsException都屬運行期異常(java.lang.RuntimeException),如果不用try...catch捕獲,程式也是可通過編譯的;但如果屬於檢查性異常(java.lang.Exception),必須而且一定要用try...catch...對其進行處理才能編譯。

int x = (int)(Math.random()*5);int y = (int)(Math.random()*10);int [] z =new int[5];try{    System.out.println("y/x="+(y/x));    System.out.println("y="+y+"z[y]="+z[y]);}catch (ArithmeticException exc1){    System.out.println("算術運算異常:"+exc1.getMessage());}catch (ArrayIndexOutOfBoundsException exc2){    System.out.println("資料越界異常:"+exc2.getMessage());}

       B,finally。如果把finally塊置try...catch...語句後,finally塊一般都會得到執行,它相當於一個萬能的保險,即使前面的try塊發生異常,而又沒有對應異常的catch塊,finally塊將馬上執行。
以下情形,finally塊將不會被執行:
(1)finally塊中發生了異常;
(2)程式所線上程死亡;
(3)在前面的代碼中用了System.exit();
(4)關閉CPU。

       C,拋出異常,即throws的使用。

package draw;import java.util.Scanner;public class Sub{    public static void main(String[] agrs ){        try {           divide();      //2.我們在mian方法中調用下面拋出異常的方法,這個時候我們用try-catch語句進行處理        } catch (Exception e) {            System.out.println("除數不能為零");            e.printStackTrace();    ///3.這個方法的意思列印出異常資訊        }    }    public static void divide() throws Exception{//1.這裡我們就拋出了一個Exception的異常,把這個申明為static是為了不用建立對象就可以調用它。        Scanner input = new Scanner(System.in);        System.out.println("請輸入被除數:");        int num = input.nextInt();        System.out.println("請輸入除數:");        int num2 = input.nextInt();          System.out.println("num除以num2的商是:"+num/num2);    }}

       以上就是一個拋出異常--調用方法的時候捕獲異常的一般過程。如果我們在上面的例子中不希望在調用方法時候用try-catch來捕獲異常,我們可以把異常交給調用他的main方法,進行再次拋出。新的程式碼範例如下:

package draw;import java.util.Scanner;public class Sub{     public static void main(String[] agrs ) throws Exception{ //這裡我們對異常進行再次拋出,此例子中,我們交給了java虛擬機器進行處理,如果是一個普通的方法,就有兩種選擇一是再次拋出,二是try-catch進行處理,異常拋到最後必須進行處理。平時遇到我們一般不像例子這樣寫,一般在遇到main方法的時候,就用try-catch處理就完了         divide();     }     public static void divide() throws Exception{         Scanner input = new Scanner(System.in);         System.out.println("請輸入被除數:");         int num = input.nextInt();         System.out.println("請輸入除數:");         int num2 = input.nextInt();           System.out.println("num除以num2的商是:"+num/num2);     }}

        Exception是所有可捕獲異常類的父類,我在捕獲的時候不想捕獲它下面的其他的異常,我們只想捕獲其中的一個或者幾個這個時候我們怎麼辦呢?請看寫法:

public static void divide()throws ArithmeticException,InputMismatchException{代碼塊}中間用逗號隔開,可以使用Thows關鍵字指定多種拋出的異常。
(3)多個異常的處理規則:
       定義多個catch可精確地定位異常。如果為子類的異常定義了特殊的catch塊,而父類的異常則放在另外一個catch塊中,此時,必須滿足以下規則:子類異常的處理塊必須在父類異常處理塊的前面,否則會發生編譯錯誤。所以,越特殊的異常越在前面處理,越普遍的異常越在後面處理。這類似於制訂防火牆的規則次序:較特殊的規則在前,較普通的規則在後。
       自己也可以定義並拋出異常,方法是2步:建立異常,拋出異常(首先執行個體化一個異常對象,然後用thow拋出)。將建立異常、拋出異常合在一起的好處是:建立異常時,會包含異常建立處的行資訊,異常被捕獲時可以通過堆棧跡(stack Trace)的形式報告這些資訊。如果在同一行代碼建立和拋出異常,對於程式的調試將非常有用。所以,thow new XXX()已經成為一個標準的異常拋出範式。
        對異常的處理,有一條行之有效預設規則:向上拋出-----被調用類在運行過程中對遇到的異常一概不作處理,而是直接向上拋出,一直到最上層的調用類,調用類根據應用系統的需求和特定的異常處理規則進行處理,如向控制台輸出異常堆棧資訊,列印在記錄檔中。用一句形象的話來說,就是誰使用,誰(最上層的調用類)處理。

參考原文:http://edu.codepub.com/2009/0806/12426.php 

參考原文:http://blog.sina.com.cn/s/blog_752265d10100wl8u.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.