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增多、日誌文件而影響服務。