天天看點

從零學Java——異常處理機制

前提

    異常處理早已成為衡量一門語言是否成熟的标志之一。增加異常處理機制後的程式有更好的容錯性,以及健壯性。

異常的處理機制

1、使用try…catch捕獲異常

public static void main(String[] args) {
    try {
      int x = 10/0;
    } catch (Exception e) {
      e.printStackTrace();
      
    }
  }      

2、catch使用方式

    1、發生異常後catch處理方式

    當java運作時收到異常對象時,尋找能處理該異常對象的catch塊,若能找到合适的則交給catch塊處理,這個過程稱為捕獲異常;如果Java運作時沒有找到捕獲異常的catch塊,則運作時環境終止,Java程式也将退出。

    2、try=》catch,關系1...n    

    一個try可以對應多個catch塊,而且catch塊的處理順序應該先小後大。原因是如果大的異常放到前面,小的異常catch将永遠無法得到執行。

   3、catch=》異常類型,關系1...n

   從java7之後一個catch塊可以通過|(豎線)捕獲多個類型的異常。

3、異常資訊擷取

一共有四種方式

1、getMessage();傳回該異常的較長的描述

2、printStackTrance();将異常的跟蹤堆棧資訊輸出到标準錯誤輸出

3、printStackTrance(PrintStream s);将該異常跟蹤棧資訊輸出到指定輸出流

4、getStackTrance();傳回異常的跟蹤棧資訊

四種異常資訊擷取列印

從零學Java——異常處理機制

getStackTrance中擷取是一個數組,可以根據需要列印相關的詳細内容。提供個大家一個工具類,把getStackTrance()轉換為string類型列印

private static String getStackMsg(Exception e) {

    StringBuffer sb = new StringBuffer();
    StackTraceElement[] stackArray = e.getStackTrace();
    for (int i = 0; i < stackArray.length; i++) {
      StackTraceElement element = stackArray[i];
      sb.append(element.toString() + "\n");
    }
    return sb.toString();
  }

  private static String getStackMsg(Throwable e) {

    StringBuffer sb = new StringBuffer();
    StackTraceElement[] stackArray = e.getStackTrace();
    for (int i = 0; i < stackArray.length; i++) {
      StackTraceElement element = stackArray[i];
      sb.append(element.toString() + "\n");
    }
    return sb.toString();
  }      

4、finally回收資源

1、finally作用

    當在程式的try中打開了一些實體資源(資料庫連接配接,網絡連接配接,磁盤檔案),必須顯式回收。當程式發生異常後,為了保證一定能回收try塊中打開的實體資源,就可以使用finally塊。無論try塊中代碼是否出現異常,也無論哪個catch塊被執行,也無論try…catch中是否有return執行,finally塊中的總會被執行。

2、當程式中有finally後return執行機制

   當try…catch中有return語句的時候,當執行到return語句,程式會檢查是否有finally塊,如果則先執行finally中的代碼,之後則傳回到return語句處繼續執行,但是當程式中使用system.exit(1)會退出虛拟機導緻finally中的代碼無法執行。

   一旦finally中使用了return或者throw語句,會導緻try,catch中return,throw語句失效。

3、添加finally會導緻代碼臃腫的問題,解決臃腫代碼的問題

    在java7之後增加了try的功能,允許try關鍵字緊跟一對圓括号,在圓括号中可以聲明,初始化多個資源,此處的資源表明必須在程式結束時顯示關閉的資源。

    注意:為了保證try語句能夠正常關閉這些資源,資源必須實作AutoCloseable或者Closeable接口,實作這兩個接口就必須實作close()方法。

【總結】