一.異常體系
Java異常體系
1.Throwable
- 所有Error和Exception的父類
2.Error
- 系統(tǒng)級別柳骄,JVM相關是掰,程序不可處理的錯誤复凳,如OutOfMemoryError丽啡,NoClassDefFoundError谋右,StackOverflowError
3.Exception
- 程序可處理,JVM運行外的異常补箍,包括
1)RuntimeException:不受檢異常改执,不需try-catch,如NullPointerException坑雅,IndexOutOfBoundsException辈挂,ClassCastException
2)非運行時異常:受檢異常,需try-catch霞丧,如:IOException呢岗,SQLException
二.異常處理
1.拋出異常
- 使用throws語句
- 方法創(chuàng)建異常對象并交付運行時系統(tǒng)
- 異常對象包含異常類型和異常出現(xiàn)時的程序狀態(tài)等信息
- 運行時系統(tǒng)尋找處置異常的代碼并執(zhí)行
2.捕獲異常
- 使用try-catch-finally語句
- try包含可能發(fā)生異常的代碼塊,稱為監(jiān)控區(qū)域
- 該監(jiān)控區(qū)域出現(xiàn)的異常將交給對應的catch處理
- 某個catch捕獲到異常后進入異常處理代碼蛹尝,此時其他catch再無機會匹配和處理異常
- finally中內(nèi)容無論異常是否出現(xiàn)都將執(zhí)行
- try或catch調(diào)用return后豫,finally將在return前執(zhí)行,此時若finally中也有return突那,將覆蓋try中return
- try或catch調(diào)用System.exit()挫酿,finally將不會執(zhí)行
- 如下代碼,將返回false愕难,return true是不可到達語句早龟,將在編譯時去除
public static boolean decision() {
try {
return true;
} finally {
return false;
}
}
三.異常優(yōu)化
參考:http://www.reibang.com/p/8e18b0fae090
1.Java中構造異常耗時較長
- 創(chuàng)建異常對象時會調(diào)用父類Throwable的fillInStackTrace()方法生成棧追蹤信息
其中fillInStackTrace源碼如下:
public synchronized Throwable fillInStackTrace() {
if (stackTrace != null ||
backtrace != null /* Out of protocol state */ ) {
fillInStackTrace(0); // native方法
stackTrace = UNASSIGNED_STACK;
}
return this;
}
- 創(chuàng)建帶棧追蹤信息的對象比創(chuàng)建不帶棧追蹤信息的對象慢50倍
2.開發(fā)時使用異常機制實現(xiàn)錯誤處理邏輯
- 分為業(yè)務異常和系統(tǒng)異常兩類
- 棧追蹤信息對業(yè)務異常意義不大惫霸,只需定義問題描述字符串即可
3.創(chuàng)建不含棧追蹤信息的自定義異常
- 自定義異常需要重寫父類(Exception或RuntimeException)中構造方法
rotected RuntimeException(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
- 其中writableStackTrace變量表示是否生成棧追蹤信息,將之定義為false即可在構造異常對象時不調(diào)用fillInStackTrace()方法
- 自定義異常示例
ublic class XXXException extends RuntimeException {
/**
* 僅包含message, 沒有cause, 也不記錄棧異常, 性能最高
* @param msg
*/
public XXXException(String msg) {
this(msg, false);
}
/**
* 包含message, 可指定是否記錄異常
* @param msg
* @param recordStackTrace
*/
public EngineException(String msg, boolean recordStackTrace) {
super(msg, null, false, recordStackTrace);
}
/**
* 包含message和cause, 會記錄棧異常
* @param msg
* @param cause
*/
public EngineException(String msg, Throwable cause) {
super(msg, cause, false, true);
}
}
- 上述優(yōu)化適用高并發(fā)和異常頻繁的系統(tǒng)葱弟,即使生成棧追蹤信息壹店,耗時也僅是納秒級,對單個請求而言微不足道
江涵秋影雁初飛芝加,與客攜壺上翠微