Java-异常

在这里插入图片描述
Throwable 派生出 Error 和 Exception ,Exception 是指应用正常运行中,可以被预料的意外情况,程序捕获后可以进行相应的处理。Error 是指在正常情况下,不大可能出现的情况,而绝大多数的 Error 都会导致程序进入非正常的、不可恢复的状态
在这里插入图片描述
Checked && Unchecked Exception
对于程序来说,异常又可以划分为应检查(checked)异常和不检查(unchecked)异常,应检查异常要求必须在代码里进行显式捕获和处理,javac 会在编译期间就进行检查。

try…catch…finally 语句块
    try (ServletOutputStream outputStream = response.getOutputStream()) { // Try-with-resources
        // 1. try块中放可能发生异常的代码
        // 1.1 如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)
        // 1.2 如果发生了异常,则会先尝试去匹配catch块,最后再执行finally块(如果有的话)
    } catch (ClassCastException | IndexOutOfBoundsException e) {  // Multiple catch
        // 1. 每一个catch块用于捕获并处理一个特定的异常,或者这个异常类型的子类。Java7提供的multiple catch新特性,可以将多个异常声明在一个catch中
        // 2. catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常
        // 3. 在catch块中可以使用这个块的异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问
        // 4. 如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally,然后到这个函数的外部caller中去匹配异常处理器
        // 5. 如果try中没有发生异常,则所有的catch块将被忽略
    } catch (Exception e) {
        // 1. 异常匹配是按照catch块的顺序从上往下寻找的,只有第一个匹配的catch会得到执行。匹配时,不仅运行精确匹配,也支持父类匹配
        // 2. 如果同一个try块下的多个catch异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面,确保每个catch块都有其存在的意义
        // 3. 异常处理就是将执行控制流从异常发生的地方转移到能够处理这种异常的地方。当一个函数的某条语句发生异常时,这条语句的后面的语句就不会再执行了,它失去了焦点
    } finally {   
        // 1. finally块是可选的
        // 2. 无论异常是否发生,异常是否匹配被处理,finally都最终会执行
        // 3. 一个try至少要有一个catch块,否则至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常
        // 4. finally主要做一些资源的清理工作,比如流的关闭,数据库连接的关闭等;Java7及以后的版本中,更是推荐使用try-with-resources这种新特性来简化这些操作 
    }
throws 异常声明

throws 是另一种处理异常的方式,它不同于 try…catch…finally,throws仅仅是将函数中可能出现的异常向调用者声明,其本身并不进行处理。

    public void example() throws IOException { 

    }
finally 块

try块中的代码执行完后,finally块是一定执行的。但也有一种比较特殊的情况,就是在这之前执行了System.exit()。

finally块通常用来做资源的释放、关闭文件等操作。良好的编程习惯是:在try块中打开资源,在finally块中清理并释放这些资源,Java7之后更是推荐直接使用try-with-resources。

下面简单总结一下:

finally块没有处理异常的能力,处理异常的只能是catch块;

在同一try…catch…finally块中 ,如果try中抛出异常,且有匹配的catch块,则先执行catch块,再执行finally块。如果没有catch块匹配,则先执行finally,然后去外面的调用者中寻找合适的catch块;

在同一try…catch…finally块中 ,try发生异常,且匹配的catch块中处理异常时也抛出异常,后面的finally还是会先执行,最后才去外围调用者中寻找合适的catch块。

补充几点开发建议:

不要在fianlly中使用return
不要在finally中向外抛出异常
不要在finally中做除了释放资源的其它的事情
用try-with-resources避免finally

转发:
https://www.jianshu.com/p/0ce240d84f9d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值