java異常捕獲

1.異常捕獲的例子java

String str = null;
    try {
        if (str.equals("abc")) System.out.println("equal!");
        str = "ac";
        System.out.println("後面的程序不執行了!");
    } catch (NullPointerException e) {
        str = new String("bac");
        if (str.equals("abc")) System.out.println("unequal");
        else System.out.println("equal");
    }

    System.out.println(str);
    System.out.println("代碼還須要執行!");
}

nullpointerException是運行時的異常,若是不進行捕獲的話,那麼在第一句的時候變會直接終止程序。但是利用了捕獲的話,能夠繼續運行,從而相對增長了程序的健壯性,程序避免癱瘓。函數

2.什麼時候用try..catch?操作系統

當你以爲你的代碼會出現異常的時候,你就能夠用try。。catch,所以try。。catch能夠針對你寫的任何的代碼,只要你以爲可能出現異常的。而後增長異常的處理,提升代碼的健壯性。debug

3.JAVA中能夠捕獲運行時異常嗎?指針

因爲運行時的異常也是屬於throwable的子類,所以也是能夠被捕獲的。可是通常不推薦捕獲運行時候的異常,所以這個時由於邏輯錯誤致使的,屬於應該解決的bug,可是捕獲運行時候的異常,一方面是爲了減小程序運行直接crash的次數,另一方面經過捕獲了運行時的異常以後,進行一些描述,來增長用戶的體驗。日誌

運行時異常:咱們能夠不處理,由於運行時異常不須要顯式拋出。當出現這樣的異常時,老是由虛擬機接管。好比:咱們歷來沒有人去處理過NullPointerException異常,它就是運行時異常,而且這種異常仍是最多見的異常之一繼承

4.exception分類內存

異常分三種:Exception級別,這屬於檢查異常,必需要捕獲,在編譯時就會通知檢查捕獲。RuntimeException級別,這種屬於運行時異常,它是在運行時被虛擬機捕獲的異常,沒必要在代碼中顯示捕獲。Error級別的異常,他屬於虛擬機重大故障,不推薦它被捕獲,它的出現必須讓程序終止,一般它被拋給操做系統,它的出現通常是內存問題或者某種IO調用出現的虛擬機崩潰。編譯器

java捕獲檢查異常
  void someFun() throws IOException 
  { 
  if(condtion) 
  { 
  throw new IOException(); 虛擬機

//throw new IllegalArgumentException(); 效果不一樣!
  } 
  }   

  IllegalArgumentException 是一個運行時異常,繼承自RuntimeException 
  RuntimeException這種異常在程序正常運行時是不會發生的,所以這類異常不須要在程序中捕獲 
  NullPointerException也屬於這種異常 
  IOException 是非運行時異常,這類異常須要在程序中捕獲 
  若是不捕獲則須要將異常拋出,交給程序的上一層處理 
  我一般是這樣寫在方法名的後面,表示這個方法會拋出這個異常 

  非運行時異常 (編譯異常):是RuntimeException之外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,若是不處理,程序就不能編譯經過。如IOException、SQLException等以及用戶自定義的Exception異常,通常狀況下不自定義檢查異常。

運行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中能夠選擇捕獲處理,也能夠不處理。這些異常通常是由程序邏輯錯誤引發的,程序應該從邏輯角度儘量避免這類異常的發生。

      運行時異常的特色是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即便沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯經過。

5.日誌與異常

異常處理程序能作什麼?要麼把異常向上拋出中斷當前程序的執行,要麼自身消化掉不影響當前程序的運行。

不考慮異常繼續拋出的狀況,當此異常必須在本層被處理時,一般作法是捕獲到異常後打印日誌,並保持程序繼續運行。

目前項目中用的比較多日誌打印庫是log4j,他將日誌等級分爲debug、info、warning、error,區別日誌級別的緣由是防止磁盤io和日誌文件暴增,整個日誌文件的級別設置在info級別。

在try catch中捕獲的異常,一般經過error級別打印在日誌文件中,方便後續排查問題。

針對項目的具體需求而言,並非全部在try catch中捕獲到的異常都應該設置在error級別,而且不是全部的錯誤都應該打出調用棧信息。

特別是與調用量相關的函數方法,當客戶端調用觸發大量異常時,對服務端而言大量捕獲異常並打印日誌會致使服務端磁盤io增多、日誌文件而影響服務。

相關文章
相關標籤/搜索