Java系列4 異常

一.異常體系

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)葱弟,即使生成棧追蹤信息壹店,耗時也僅是納秒級,對單個請求而言微不足道

江涵秋影雁初飛芝加,與客攜壺上翠微

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硅卢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子藏杖,更是在濱河造成了極大的恐慌将塑,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝌麸,死亡現(xiàn)場離奇詭異点寥,居然都是意外死亡,警方通過查閱死者的電腦和手機来吩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門敢辩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人误褪,你說我怎么就攤上這事责鳍。” “怎么了兽间?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵历葛,是天一觀的道長。 經(jīng)常有香客問我嘀略,道長沦辙,這世上最難降的妖魔是什么呐萨? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任最域,我火速辦了婚禮洋腮,結果婚禮上,老公的妹妹穿的比我還像新娘讼育。我一直安慰自己帐姻,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布奶段。 她就那樣靜靜地躺著饥瓷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痹籍。 梳的紋絲不亂的頭發(fā)上呢铆,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音蹲缠,去河邊找鬼棺克。 笑死悠垛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的娜谊。 我是一名探鬼主播确买,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼因俐!你這毒婦竟也來了拇惋?” 一聲冷哼從身側響起周偎,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤抹剩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蓉坎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澳眷,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年蛉艾,在試婚紗的時候發(fā)現(xiàn)自己被綠了钳踊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡勿侯,死狀恐怖拓瞪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情助琐,我是刑警寧澤祭埂,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站兵钮,受9級特大地震影響蛆橡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掘譬,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一泰演、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葱轩,春花似錦睦焕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缭嫡,卻和暖如春缔御,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妇蛀。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工耕突, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笤成,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓眷茁,卻偏偏與公主長得像炕泳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子上祈,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Java異常類型 所有異常類型都是Throwable的子類培遵,Throwable把異常分成兩個不同分支的子類Erro...
    予別她閱讀 934評論 0 2
  • 異常:現(xiàn)實生活的病現(xiàn)實生活中萬物在發(fā)展和變化會出現(xiàn)各種各樣不正常的現(xiàn)象。1:例如:人的成長過程中會生病登刺。|——病|...
    多了去的YangXuLei閱讀 1,012評論 0 6
  • 概念介紹 異常是發(fā)生在程序執(zhí)行過程中阻礙程序正常執(zhí)行的錯誤事件籽腕,當一個程序出現(xiàn)錯誤時,可能的情況有如下3種: 語法...
    niaoge2016閱讀 5,187評論 2 20
  • 異常處理機制 異常處理模型:終止模型:當異常發(fā)生時纸俭,就進入異常處理程序皇耗,處理結束并不返回異常發(fā)生位置繼續(xù)執(zhí)行;恢復...
    LilacZiyun閱讀 498評論 0 2
  • 北京時間8月17日揍很,中國足協(xié)開出一系列罰單郎楼,中甲青島黃海俱樂部官員米蓋爾由于破壞比賽設施,被處以警告窒悔,并被罰款1萬元呜袁。
    排球那些事閱讀 127評論 0 0