Java 中 try-catch-finally 结构中 finally 代码块的执行顺序

1. finally代码块中的程序一定会被执行
2. 如果try{}中有return语句,finally在return语句之前执行 (return意味着结束调用)
3. 如果finally中有return语句,则fianlly块中的return语句将覆盖别处的return语句

扩充知识:

如果在try中返回的数据类型是基本数据类型,在finally块中改变return的值对返回值没有任何影响;但是如果返回值类型是引用类型,则有影响。展示于下面的代码:

	public static int test01() {
		int re = 3;
		try {
			return re;
		} catch (Exception e) {
			return 0;
		} finally {
			re = 5;
			System.out.println("test01中的finally被执行了");
		}
	}

	public static StringBuffer test02() {
		StringBuffer str = new StringBuffer("Hello");
		try {
			return str;
		} catch (Exception e) {
			return null;
		} finally {
			str.append(" World!");
			System.out.println("test02中的finally被执行了");
		}
	}

	public static void main(String[] args) {
		int i = test01();
		System.out.println(i);// 3
		StringBuffer str = test02();
		System.out.println(str);
	}

执行结果:

test01中的finally被执行了
3
test02中的finally被执行了
Hello World!

解释:

程序在执行到return 时会首先将返回值存储在一个指定的位置, 其次去执行finally 块, 最后再返回。在方法test01中调用return 前, 先把result 的值3存储在一个指定的位置, 然后再去执行finally 块中的代码, 此时修改result 的值将不会影响到程序的返回结果。test02中, 在调用return 前首先把str存储到一个指定的位置, 由于str为引用类型, 因此在finally 块中修改s 将会修改程序的返回结果。

发布了58 篇原创文章 · 获赞 0 · 访问量 1007

猜你喜欢

转载自blog.csdn.net/Mason97/article/details/104325215