finally关键字注意事项

定义:
finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率。

注意事项:

  • 如果try中含有System.exit(0),即退出虚拟机,则finally中的语句不执行,还有没有执行到try语句程序就中止了,也不会执行finally,最后一个是当所有的非守护线程中止时,不论存不存在守护线程,虚拟机都会kill掉守护线程从而中止程序。 虚拟机中,执行main方法的线程就是一个非守护线程,垃圾回收则是另一个守护线程,main执行完,程序就中止了,而不管垃圾回收线程是否中止。 所以,如果守护线程中存在finally代码块,那么当所有的非守护线程中止时,守护线程被kill掉,其finally代码块是不会执行的。

  • try catch finally 里有return的执行机制(条件是try和catch中都有return):

    • 当finally中没有return时,就算finally里代码对返回的变量进行修改,但是这个作用范围只在finally代码块以及 后边的代码 有效,实际return的还是try 或者catch之前的返回值。如:
public static int test() {
		int i = 0;

		try {
			
			return i ++;
		} catch (Exception e) {
			e.printStackTrace();
			return 1;
		} finally {
			
			i ++;
			System.out.println(i);
//			return i;
		}

	}

public static void main(String[] args) throws CloneNotSupportedException {
		
		System.out.println(test());

	}

会打印2和0。原因是执行finally之前会将try中的语句/catch总的语句执行完,包括return后的运算,在这段代码中,return 后的i ++就会被执行,但是不会先返回,等finally执行完才返回。但是为什么finally中对要返回的值的修改没有用呢?应该是try在返回前是把一个i ++ 操作后的 i变量备份了一遍,将备份的i给finally进行操作,此时对备份的操作自然不会影响原来的i变量。

  • 当finally中有return时,即将上述代码中的return i;的注释删掉,结果就会变为 2和2了,原因就是finally已经返回了,try或catch就不会执行了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值