19.10.23

//1.Java的异常
异常继承自throwable异常根体系
它有两个体系,一个是error一个是Execption
Exception又分为两大类:
RuntimeException以及它的子类;
非RuntimeException(包括IOException、ReflectiveOperationException等等)

Java规定:
必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,
这种类型的异常称为Checked Exception。
不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。

//2.异常捕获
同时,如果异常处理语句相同,可以放到一个catch下
如:
catch(IOException | RuntimeException){
    ......
}
使用try ... catch ... finally时:
多个catch语句的匹配顺序非常重要,子类必须放在前面;
finally语句保证了有无异常都会执行,它是可选的;
一个catch语句也可以匹配多个非继承关系的异常

//3.抛出异常
当某个方法抛出异常时,如果当前方法没有捕获异常,就会往上一层传播直到被捕获
即直到遇见try....catch

如何抛出异常
<1>创建一个Exception的实例
<2>用throw语句抛出

因此,在catch中抛出异常,不会影响finally的执行。JVM会先执行finally,然后抛出异常。
异常屏蔽
如果在执行finally语句时抛出异常,那么catch中的异常就不会抛出了
在极少数情况下我们需要获知所有的异常,
方法是先用origin变量保存原始异常,然后调用Throwable.addSuppressed(),
把原始异常添加进来,最后在finally抛出:
public class Main {
    public static void main(String[] args) throws Exception {
        Exception origin = null;
        try {
            System.out.println(Integer.parseInt("abc"));
        } catch (Exception e) {
            origin = e;
            throw e;
        } finally {
            Exception e = new IllegalArgumentException();
            if (origin != null) {
                e.addSuppressed(origin);
            }
            throw e;
        }
    }
}
通过Throwable.getSuppressed()可以获取所有的Suppressed Exception。
绝大多数情况下,在finally中不要抛出异常。
因此,我们通常不需要关心Suppressed Exception。
posted @ 2019-10-30 21:01  睿晞  阅读(167)  评论(0编辑  收藏  举报