[TOC]

## Throwable
* Java 語言中所有錯誤或異常的超類。
* Throwable 包含了其線程創建時線程執行堆棧的快照。它還包含了給出有關錯誤更多信息的消息字符串。
* 它還可以包含 cause(原因)
## Error
* Error 是 Throwable 的子類,用于指示合理的應用程序**不應該試圖捕獲的嚴重問題**。
* 大多數這樣的錯誤都是異常條件。雖然 ThreadDeath 錯誤是一個“正規”的條件,但它也是 Error 的子類,因為大多數應用程序都不應該試圖捕獲它。
* 在執行該方法期間,無需在其 throws 子句中聲明可能拋出但是未能捕獲的 Error 的任何子類,因為這些錯誤可能是再也不會發生的異常條件。
* Java 程序通常不捕獲錯誤。錯誤一般發生在嚴重故障時,它們在Java程序處理的范疇之外。
## Exception
Exception 異常主要分為兩類
1. RuntimeException(運行時異常),RuntimeException 被稱作「非受查異常」。
2. 其他Exception,稱作「受查異常」
受查異常就是指,編譯器在編譯期間要求必須得到處理的那些異常,你必須在編譯期處理了。
## 自定義異常類型
Java 的異常機制中所定義的所有異常不可能預見所有可能出現的錯誤,某些特定的情境下,則需要我們自定義異常類型來向上報告某些錯誤信息。
在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。
* 所有異常都必須是 Throwable 的子類。
* 如果希望寫一個檢查性異常類,則需要繼承 Exception 類。
* 如果你想寫一個運行時異常類,那么需要繼承 RuntimeException 類。
## 異常的處理方式
### try...catch關鍵字
* 使用 try 和 catch 關鍵字可以捕獲異常。
* try/catch 代碼塊放在異常可能發生的地方。
### try catch不會影響性能
* 異常如果沒發生,也就不會去查表,也就是說你寫不寫try catch 也就是有沒有這 個異常表的問題,如果沒有發生異常,寫try catch對性能是木有消耗的,所以不會讓程序跑得更慢。
* try 的范圍大小其實就是異常表中兩個值(開始地址和結束地址)的差異而已,也是不會影響性能的。
### throws/throw 關鍵字
如果一個方法**沒有捕獲一個檢查性異常**,那么該方法**必須使用 throws 關鍵字來聲明**。throws 關鍵字放在方法簽名的尾部。**也可以使用 throw 關鍵字拋出一個異常**,無論它是新實例化的還是剛捕獲到的。
### finally關鍵字
注意,凡是有finally,那么一定會執行里面的代碼,并且根據里面的return
## 推薦閱讀
[java-異常體系](https://www.jianshu.com/p/49d2c3975c56)
- Java
- Object
- 內部類
- 異常
- 注解
- 反射
- 靜態代理與動態代理
- 泛型
- 繼承
- JVM
- ClassLoader
- String
- 數據結構
- Java集合類
- ArrayList
- LinkedList
- HashSet
- TreeSet
- HashMap
- TreeMap
- HashTable
- 并發集合類
- Collections
- CopyOnWriteArrayList
- ConcurrentHashMap
- Android集合類
- SparseArray
- ArrayMap
- 算法
- 排序
- 常用算法
- LeetCode
- 二叉樹遍歷
- 劍指
- 數據結構、算法和數據操作
- 高質量的代碼
- 解決問題的思路
- 優化時間和空間效率
- 面試中的各項能力
- 算法心得
- 并發
- Thread
- 鎖
- java內存模型
- CAS
- 原子類Atomic
- volatile
- synchronized
- Object.wait-notify
- Lock
- Lock之AQS
- Lock子類
- 鎖小結
- 堵塞隊列
- 生產者消費者模型
- 線程池