最近打算跳槽,讀了一下極客時間的java核心技術(shù)36講,感覺還不錯,就此做個筆記(感興趣的也可以點擊購買鏈接http://stuq.com/a/100nJ,非廣告推廣)。本文所有內(nèi)容,摘自https://time.geekbang.org/column/article/6849筆記,侵刪
引言
Exception 和 Error 都是繼承了Throwable類,在java中只有Throwable的實例才能被拋出或者捕獲。
Error不能恢復(fù)java程序也不應(yīng)該被捕獲。
Exception分為可檢查和不可檢查的類型,可檢查的異常應(yīng)該在編碼期間顯式捕獲,因為虛擬機會在編譯期進行檢查。不檢查異常是指類似 NullPointerException、ArrayIndexOutOfBoundsException
深入理解異常

Error和Exception都繼承于Throwable。
ClassNotFoundException和NoClassDefFoundError的區(qū)別??
首先NoClassDefFoundError是一個錯誤(Error),而ClassNOtFoundException是一個異常,ClassNotFoundException的產(chǎn)生原因:
Java支持使用Class.forName方法來動態(tài)地加載類,任意一個類的類名如果被作為參數(shù)傳遞給這個方法都將導(dǎo)致該類被加載到JVM內(nèi)存中,如果這個類在類路徑中沒有被找到,那么此時就會在運行時拋出ClassNotFoundException異常。
另外還有一個導(dǎo)致ClassNotFoundException的原因就是:當一個類已經(jīng)某個類加載器加載到內(nèi)存中了,此時另一個類加載器又嘗試著動態(tài)地從同一個包中加載這個類。
NoClassDefFoundError產(chǎn)生的原因:
如果JVM或者ClassLoader實例嘗試加載(可以通過正常的方法調(diào)用,也可能是使用new來創(chuàng)建新的對象)類的時候卻找不到類的定義。要查找的類在編譯的時候是存在的,運行的時候卻找不到了。這個錯誤往往是你使用new操作符來創(chuàng)建一個新的對象但卻找不到該對象對應(yīng)的類。這個時候就會導(dǎo)致NoClassDefFoundError.
處理異常
1.不要捕獲通用異常,而是要捕獲特定異常
2.不要不要生吞異常
3.Throw early, catch late,盡早在能避免異常的時候拋出異常,然后再處理異常
4.自定義異常的時候,考慮是否要定義成可檢查異常,因為這種異常是考慮到可以從異常中恢復(fù)制定的。另外自定義異常的時候考慮盡量不要包含敏感信息
5.java的異常處理機制中try-catch 階段會產(chǎn)生額外的開銷,影響JVM對代碼的優(yōu)化,不要用異常處理。另外每生成一個異常,jvm都會對當前棧進行快照,(個人理解是:??煺帐菞?nèi)操作的集合,用來記錄棧操作的)
- 一個函數(shù)盡管拋出了多個異常,但是只有一個異??杀粋鞑サ秸{(diào)用端。最后被拋出的異常時唯一被調(diào)用端接收的異常,其他異常都會被吞沒掩蓋。如果調(diào)用端要知道造成失敗的最初原因,程序之中就絕不能掩蓋任何異常。
7.當遇到return語句的時候,執(zhí)行函數(shù)會立刻返回。但是,在Java語言中,如果存在finally就會有例外。除了return語句,try代碼塊中的break或continue語句也可能使控制權(quán)進入finally代碼塊。