1. 程式人生 > >java核心技術之Exception和Error有什麽區別

java核心技術之Exception和Error有什麽區別

poi 恢復 exception array 機會 col 註意 .com 這樣的

典型回答:

Exception和Error都是繼承了Throwable類。在Java中只有Throwable類型的實例才可以被拋出(throw)或者捕獲(catch),它是異常處理機制的基本組成類型。

Exception和Error體現了Java平臺設計者對不同異常情況的分類。Exception是程序正常運行中,可以預料的意外情況,可能並且應該被捕獲,進行相應處理。

Error是指在正常情況下,不大可能出現的情況,絕大部分的Error都會導致程序處於非正常的、不可恢復狀態。既然是非正常情況,所以不便於也不需要捕獲,常見的比如OutOfMemoryError之類,都是Error的子類。

Exception

又分為可檢查異常(checked)和不檢查異常(unchecked),可檢查異常在源代碼裏必須顯式地進行捕獲處理,這是編譯期檢查的一部分。前面我介紹的不可查的Error,是Throwable不是Exception。不檢查異常就是所謂的運行時異常,類似NullPointerException、ArrayIndexOutOfBoundsException之類,通常是可以編碼避免的邏輯錯誤,具體根據需要來判斷是否需要捕獲,並不會在編譯期強制要求。

技術分享圖片

第一,盡量不要捕獲類似 Exception 這樣的通用異常,而是應該捕獲特定異常,在這裏Thread.sleep() 拋出的 InterruptedException。這是因為在日常的開發和合作中,我們讀代碼的機會往往超過寫代碼,軟件工程是門協作的藝術,所以我們有義務讓自己的代碼能夠直觀地體現出盡量多的信息,而泛泛的 Exception 之類,恰恰隱藏了我們的目的。另外,我們也要保證程序不會捕獲到我們不希望捕獲的異常。比如,你可能更希望 RuntimeException 被擴散出來,而不是被捕獲。進一步講,除非深思熟慮了,否則不要捕獲 Throwable 或者 Error,這樣很難保證我們能夠正確程序處理 OutOfMemoryError。

第二,不要生吞(swallow)異常。這是異常處理中要特別註意的事情,因為很可能會導致非常難以診斷的詭異情況。生吞異常,往往是基於假設這段代碼可能不會發生,或者感覺忽略異常是無所謂的,但是千萬不要在產品代碼做這種假設!
如果我們不把異常拋出來,或者也沒有輸出到日誌(Logger)之類,程序可能在後續代碼以不
可控的方式結束。沒人能夠輕易判斷究竟是哪裏拋出了異常,以及是什麽原因產生了異常。

java核心技術之Exception和Error有什麽區別