java-異常詳解,java-詳解

來源:互聯網
上載者:User

java-異常詳解,java-詳解

(一)異常機制出現的原因

異常處理能提升程式的健壯性,C語言中是通過函數返回值來處理異常的,這種做法的弊端:

1.返回值與現有邏輯可能衝突。

2.代碼可讀性差。執行代碼和異常處理代碼混淆在一起。

3.需瞭解函數返回值詳細資料,以做處理。

/** * 異常處理demo *  * @author peter_wang * @create-time 2014-9-24 上午9:24:35 */public class ExceptionDemo {    /**     * @param args     */    public static void main(String[] args) {        int num = operateNum(5);        // 函數外部使用者需知道異常傳回值        // Function Compute結果剛好為-1,本質上不屬於異常範圍        // 異常處理加重程式耦合性,異常處理和正常處理混淆在一起        if (num == -1) {            System.out.println("傳入參數不正確");        }        else {            System.out.println("計算結果:" + num);        }    }    private static int operateNum(int num) {        if (num == 0) {            return -1;        }        num = 10 / num;        num -= 3;        return num;    }}


(二)異常分類


系統級錯誤(error):如記憶體消耗完,通常情況下不需要理會。

編譯時間錯誤:這種異常必須在代碼裡被顯示的捕獲語句包住,否則編譯不過,如FileNotFoundException。

執行階段錯誤:代碼不規範產生的錯誤,出現錯誤需要程式員更改bug,如null 指標異常和數組下標越界。


(三)異常的使用

1.不要忽略異常

        try {           ......        }        catch (Exception e) {        }
不處理異常,違背了異常設計的初衷,程式出錯難以找到錯誤原因。

2.不要把邏輯性較強的代碼分離

FileInputStream is = null;        try {            is = new FileInputStream(new File(""));        }        catch (FileNotFoundException e) {            e.printStackTrace();        }        try {            is.read();        }        catch (IOException e) {            e.printStackTrace();        }
異常捕捉分離了邏輯較強的代碼,可讀性變差。應採用如下代碼

FileInputStream is = null;        try {            is = new FileInputStream(new File(""));            is.read();        }        catch (FileNotFoundException e) {            e.printStackTrace();        }        catch (IOException e) {            e.printStackTrace();        }
3.能處理的異常不向上傳遞

對異常的處理有兩種方式:自己處理catch和向上傳遞throw。

向上傳遞代表了太多未知,能處理的自己處理,除非事Crowdsourced Security Testing道該資訊需要上層處理才傳遞。

4.IO異常處理

如果使用了一些資源例如資料庫連接或者網路連接,記住在finally中做一些清理工作(如關閉資料庫連接或者網路連接)。

5.不要全部用Exception來捕捉異常

細化異常類型,能有利於處理和錯誤資訊捕捉。




java異常處理詳解

異常處理是程式設計中一個非常重要的方面,也是程式設計的一大痛點,從C開始,你也許已經知道如何用if...else...來控制異常了,也許是自發的,然而這種控制異常痛苦,同一個異常或者錯誤如果多個地方出現,那麼你每個地方都要做相同處理,感覺相當的麻煩! Java語言在設計的當初就考慮到這些問題,提出異常處理的架構的方案,所有的異常都可以用一個類型來表示,不同類型的異常對應不同的子類異常(這裡的異常包括錯誤概念),定義異常處理的規範,在1.4版本以後增加了異常鏈機制,從而便於跟蹤異常!這是Java語言設計者的高明之處,也是Java語言中的一個痛點,下面是我對Java異常知識的一個總結,也算是資源回收一下。
一、Java異常的基礎知識
異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤java.lang.Error;如果你用System.out.println(11/0),那麼你是因為你用0做了除數,會拋出java.lang.ArithmeticException的異常。 有些異常需要做處理,有些則不需要捕獲處理,後面會詳細講到。 天有不測風雲,人有旦夕禍福,Java的程式碼也如此。在編程過程中,首先應當儘可能去避免錯誤和異常發生,對於不可避免、不可預測的情況則在考慮異常發生時如何處理。 Java中的異常用對象來表示。Java對異常的處理是按異常分類處理的,不同異常有不同的分類,每種異常都對應一個類型(class),每個異常都對應一個異常(類的)對象。 異常類從哪裡來?有兩個來源,一是Java語言本身定義的一些基本異常類型,二是使用者通過繼承Exception類或者其子類自己定義的異常。Exception 類及其子類是 Throwable 的一種形式,它指出了合理的應用程式想要捕獲的條件。 異常的對象從哪裡來呢?有兩個來源,一是Java運行時環境自動拋出系統產生的異常,而不管你是否願意捕獲和處理,它總要被拋出!比如除數為0的異常。二是程式員自己拋出的異常,這個異常可以是程式員自己定義的,也可以是Java語言中定義的,用throw 關鍵字拋出異常,這種異常常用來向調用者彙報異常的一些資訊。 異常是針對方法來說的,拋出、聲明拋出、捕獲和處理異常都是在方法中進行的。 Java異常處理通過5個關鍵字try、catch、throw、throws、finally進行管理。基本過程是用try語句塊包住要監視的語句,如果在try語句塊內出現異常,則異常會被拋出,你的代碼在catch語句塊中可以捕獲到這個異常並做處理;還有以部分系統產生的異常在Java運行時自動拋出。你也可以通過throws關鍵字在方法上聲明該方法要拋出異常,然後在方法內部通過throw拋出異常對象。finally語句塊會在方法執行return之前執行,一般結構如下: try{ 程式碼 }catch(異常類型1 異常的變數名1){ 程式碼 }catch(異常類型2 異常的變數名2){ 程式碼 }finally{ 程式碼 } catch語句可以有多個,用來匹配多個異常,匹配上多個中一個後,執行catch語句塊時候僅僅執行匹配上的異常。catch的類型是Java語言中定義的或者程式員自己定義的,表示代碼拋出異常的類型,異常的變數名表示拋出異常的對象的引用,如果catch捕獲並匹配上了該異常,那麼就可以直接用這個異常變數名,此時該異常變數名指向所匹配的異常,並且在catch代碼塊中可以直接引用。這一點非......餘下全文>>
 
詳細描述java是怎處理異常的?

當出現程式無法控制的外部環境問題(使用者提供的檔案不存在,檔案內容損壞,網路不可用...)時,JAVA就會用異常對象來描述。
  JAVA中用2種方法處理異常:
  1.在發生異常的地方直接處理;
  2.將異常拋給調用者,讓調用者處理。
  JAVA異常可分為3種:
  (1)檢查性異常:java.lang.Exception
  (2)運行期異常:java.lang.RuntimeException
  (3)錯誤:java.lang.Error
  頂層是java.lang.Throwable類,檢查性異常,運行期異常,錯誤都是這個類的子孫類。
  java.lang.Exception和java.lang.Error繼承自java.lang.Throwable,而java.lang.RuntimeException繼承自java.lang.Exception.
  檢查性異常------程式正確,但因為外在的環境條件不滿足引發。例如:使用者錯誤及I/O問題----程式試圖開啟一個並不存在的遠程Socket連接埠。這不是程式本身的邏輯錯誤,而很可能是遠程機器名字錯誤(使用者拼字錯誤)。對商用軟體系統,程式開發人員必須考慮並處理這個問題。JAVA編譯器強制要求處理這類異常,如果不捕獲這類異常,程式將不能被編譯。
  運行期異常------這意味著程式存在bug,如數組越界,0被除,入參不滿足規範.....這類異常需要更改程式來避免,JAVA編譯器強制要求處理這類異常。
  錯誤------一般很少見,也很難通過程式解決。它可能源於程式的bug,但一般更可能源於環境問題,如記憶體耗盡。錯誤在程式中無須處理,而有運行環境處理。
  如何處理異常?
  1.try...catch
  程式運行產生異常時,將從異常發生點中斷程式並向外拋出異常資訊。
  Java代碼
  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());
  }
  說明:ArithmeticException和ArrayIndexOutOfBoundsException都屬運行期異常:java.lang.RuntimeException,如果不用try...catch捕獲,程式也是可通過編譯的,但如果屬於檢查性異常:java.lang.Exception,必須而且一定要用try...catch...對其進行處理。
  2.finally
  如果把finally塊置try...catch...語句後,finally塊一般都會得到執行,它相當於一個萬能的保險,即使前面的try塊發生異......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.