?# 第三章第三節-拋出異常
標簽(空格分隔): 廖雪峰
---
## 異常的傳播
- 如果當前方法沒有捕獲異常,異常就會被拋到上層調用方法.
- 如果上層也未捕獲,會一直向上拋.知道遇到`try catch`為止,或者在main中聲明throw.
- `exception.printStackTrace`可以打印異常調用棧,在debug的時候很有效.
## 如何拋出
- 創建某個`Exception`的實例.
- 使用throw語句拋出.
## 轉換異常
如果一個方法捕獲了某個異常之后,又在`catch`子句中拋出新的異常,就相當于把拋出的異常轉換成新的異常.新的異常有是否帶參數兩種方式,帶參數的話就相當于保留了之前的異常棧,如果無參數就相當于舍棄了異常棧,即無法追蹤到最開始導致出錯的地方.
## finally中的執行順序.
```java
try{
語句1
}
catch{
語句2
throw new Exception()
}
finally{
語句3
}
```
執行的順序是:語句1,語句2,語句3,然后拋出新的異常.
若:
```java
try{
語句1
}
catch{
語句2
throw new Exception1()
}
finally{
語句3
throw new Exception2()
}
```
執行的順序是:語句1,語句2,語句3,異常2(異常1則會被忽略).
**最好不要在finally中拋出異常**
## 小節小結
- printStackTrace()打印異常的傳播棧,對于調試非常好用.
- 捕獲異常并在此拋出時異常時(異常轉換),應該保留原始異常的信息(含參數創建).
- 如果在finally中拋出異常,應該把新的異常添加在原有異常中,不然原有異常會被忽略(復雜變換未記錄).
- 使用getSuppressed()可以獲取所有添加的SuppressedException.
- 處理SuppressedException要求大于1.7.
- 前言
- 一:Java快速入門
- 二:Java面向對象編程
- 三:Java異常處理
- 錯誤處理
- Java的異常
- 捕獲異常
- 拋出異常
- 自定義異常
- 斷言和日志
- 使用斷言
- 使用JDK Logging
- 使用Commons Logging
- 使用Log4j
- 四:Java反射與泛型
- 反射
- Class類
- 訪問字段
- 調用方法
- 調用構造方法
- 獲取繼承關系
- 注解
- 使用注解
- 定義注解
- 處理注解
- 泛型
- 什么是泛型
- 使用泛型
- 編寫泛型
- 擦拭法
- extends通配符
- super通配符
- 泛型和反射
- 五:Java集合
- Java集合簡介
- Java集合簡介
- List
- 使用List
- 編寫equals方法
- Map
- Set
- Queue
- Stack
- 最佳實踐
- 六:Java IO編程
- 七:Java處理日期和時間
- 八:JUnit單元測試
- 九:Java正則表達式
- 十:Java加密與安全
- 十一:Java多線程編程
- 十二:Maven基礎
- 十三:Java網絡編程
- 十四:Java操作XML和JSON
- 十五:Java JDBC編程
- 十六:Java函數式編程