【Java编程的逻辑】异常 & finally & try-with-resources

finally

异常机制中还有一个重要的部分,就是finally。catch后面可以跟finally语句

try {
    // 可能抛出异常
} catch(Exception e) {
    // 捕获异常
} finally {
    // 不管有无异常都会执行
}

如果在try或者catch语句内有return语句,则return语句在finally语句执行结束后才执行,但finally并不能改变返回值

public int testReturn() {
    int ret = 0;
    try {
        ret = 5;
        return ret;
    } finally {
        ret = 2;
    }   
}

该方法返回5。


如果在finally中有return语句。try和catch内的return会丢失,实际会返回finally中的返回值。同时还会掩盖try和catch内的异常,就像没有异常发生一样

public int testReturn2() {
    int ret = 0;
    try {
        ret = 10 / 0;
        return ret;
    } finally {
        return 8;
    }
}

会返回8。


在finally中,如果抛出了异常,则原异常也会被覆盖

try {
    ret = 10 / 0;
} finally {
    throw new RuntimeException("Hi");
}

所以,一般而言,应该避免在finally中使用return语句或者抛出异常。
finally一般用于释放资源,如数据库连接、文件流等。

try-with-resources

对于一些使用资源的场景,比如文件和数据库连接,典型的使用流程是首先打开资源,最后在finally语句中调用资源的关闭方法。 针对这种场景,在Java7开始支持一种新的语法,称之为try-with-resources,这种语法针对实现了java.lang.AutoCloseable接口的对象,提供了try-with-resources功能。

该接口定义为

public interface AutoCloseable {
    void close() throws Exception;
}

没有使用try-with-resources:

public void useResource() {
    // 创建资源
    AutoCloseable r = new FileInputStream("test");
    try {
        // 使用资源
    } finally {
        r.close();
    }
}

使用try-with-resources:

public void useResource() {
    // 创建资源
    try(AutoCloseable r = new FileInputStream("test");) {
        // 使用资源
    }
}

资源r的声明和初始化放在try语句内,不用再调用finally,在语句执行完try语句后,会自动调用资源的close()方法。

资源可以定义多个,以分号分隔

throws throw

throws
定义一个方法的时候可以使用throws关键字声明。使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。

throw
throw关机字作用是抛出一个异常,抛出的时候是抛出的是一个异常类的实例化对象,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值