# 第三章第三节-抛出异常
标签(空格分隔): 廖雪峰
---
## 异常的传播
- 如果当前方法没有捕获异常,异常就会被抛到上层调用方法.
- 如果上层也未捕获,会一直向上抛.知道遇到`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函数式编程