try { } catch{ } finally{ } 执行顺序总结

-- try catch finally 执行顺序验证
public class TestTry {
	public static void main(String[] args) {
		TestTry t = new TestTry();
		System.out.println(t.getString() + " ---- return执行结束!");
	}

	public String getString() {
		String testString = "abc";
		try {
			System.out.println("执行try!");
//			 int a = 9 / 0;
			return testString;
		} catch (Exception e) {
			System.out.println("执行catch!");
			return testString;
		} finally {
			System.out.println("执行finally!");
		}
	}
}


执行结果:

    [1]执行try!
    [2]执行finally!
    [3]abc ---- return执行结束!

-------------------------------------------------------------------
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。

在转去之前,try中先把要返回的结果存放到不同于a的局部变量中去,执行完finally之后,在从中取出返回结果,

因此,即使finally中对变量a进行了改变,但是不会影响返回结果。验证实例:
public class Test11 {
	public static void main(String[] args) {
		int b = f();
		System.out.println(b);
	}

	private static int f() {
		int a = 10;
		try {
			a += 10;
			System.out.println("try");
//			int e = 3 / 0;
			a += 10;
			return a;
		} catch (Exception ex) {
			System.out.println("catch");
			return a;
		} finally {
			System.out.println("finally");
			a += 100;
		}
	}
}


执行结果:

    [1]  try
    [2]  finally
    [3]  30


结论:

1.不管出没出现异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.finally块中的语句是在return语句执行之后才执行的,即函数返回值是在finally块中语句执行前确定的;
4.finally块中不主张包含return语句,如果加了return在finally块中,将返回这个值。

总结:finally在return前执行,在finally的操作,不会改变已经确定的return的值。



你可能感兴趣的:(java基础)