try catch finally,try里有return,finally研究

直接看代码:java

代码一:ide

public class Test {
	public static void main(String[] args) {
		System.out.println(new Test().test());
	}

	static int test() {
		int x = 1;
		try {
			return x;
		} finally {
			++x;
		}
	}
}

结果:it

1

这说明了什么问题?class

finally块里面的代码老是在try块return以后执行?咱们将代码稍做修改test

代码二:总结

public class Test {
	public static void main(String[] args) {
		System.out.println(new Test().test());
	}

	static int test() {
		int x = 1;
		try {
			return x;
		} finally {
			System.out.println("finally 块执行了...");
		}
	}
}

结果:数据

finally 块执行了...
1

此时finally块好像又是在return以前执行的,咱们继续修改代码static

代码三:di

public class Test {
	public static void main(String[] args) {
		System.out.println(new Test().test());
	}

	static int test() {
		int x = 1;
		try {
			return x;
		} finally {
			++x;
			return x;
		}
	}
}

结果:view

2

发现此时返回的是2!!!,那么finally块中的代码究竟是在return以前执行呢仍是在以后和执行呢?其实二者都不是,

确切的说应该在return返回中执行,能够这样理解,在try块中的代码return以后,会将return的值存储到数据栈中,此时

并未彻底返回,而后去执行finally块,在代码一中,执行finally快的时候,数据栈中已经存储了return的值为1,即便

++x也不能改变返回值了,而代码二中,尽管数据栈中已经存储了return的值为1,可是在执行finally块的时候又return了一次,

直接覆盖了数据栈中的1变为了++x,即2。

所以作以总结,finally块是在try块还未彻底return的时候执行的!!执行完finally块以后才会彻底返回。

相关文章
相关标签/搜索