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。
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/tsruixi/p/11767896.html