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就不会执行了。
发布了14 篇原创文章 · 获赞 15 · 访问量 526

猜你喜欢

转载自blog.csdn.net/CodingNO1/article/details/104291120