首先说明一点,finally{ }里面的code一定会执行 ,至于是在return前执行还是在return后执行(个人认为是{}代码执行完之后并且在return执行之前),具体需要分情况:
1.若try{}中没有异常,则try{}中语句执行到return前一句,然后执行fianlly{}中的语句,最后回头执行try{}中的return语句。
public class Test {public static int getA() {int a = 5;try {a = 10;System.out.println("try a = " + a);return a;} catch (Exception e) {a = 15;System.out.println("catch a = " + a);return a;} finally {a = 20;System.out.println("finally a =" + a);}}public static void main(String[] args) {int a = getA();System.out.println("result a =" + a);} }
运行结果:
try a = 10 finally a =20 result a =10Process finished with exit code 0
2.若try{}中会产生异常,则在执行了会产生异常的语句之后就立马进入到catch{}语句块中,这时存在两种情况:
第一种情况:如果catch{}中没有return语句,则在执行完catch{}中的代码之后就执行fianlly{}中的语句,最后直接结束程序,并不会回到try{}中执行它的return语句。
public class Test {public static int getA() {int a = 5;try {a = 10;int b = a/0;//产生异常,执行catch代码System.out.println("try a = " + a);return a;} catch (Exception e) {a = 15;System.out.println("catch a = " + a);} finally {a = 20;System.out.println("finally a =" + a);}return a;}public static void main(String[] args) {int a = getA();System.out.println("result a =" + a);} }
执行结果
catch a = 15 finally a =20 result a =20Process finished with exit code 0
第二种情况:如果catch{}中含有return语句,则在执行完catch{}中的return的前一语句时直接进入fianlly{}中执行代码,最后回头执行catch{}中的return语句,而不是执行try{}中的return语句。
public class Test {public static int getA() {int a = 5;try {a = 10;int b = a/0;//产生异常,执行catch代码System.out.println("try a = " + a);return a;} catch (Exception e) {a = 15;System.out.println("catch a = " + a);return a;} finally {a = 20;System.out.println("finally a =" + a);}}public static void main(String[] args) {int a = getA();System.out.println("result a =" + a);} }
执行结果
catch a = 15 finally a =20 result a =15Process finished with exit code 0
最后说明一点,如果finally中有return,那么最后的结果一定是finally中的return结果(不管有没有异常)
public class Test {public static int getA() {int a = 5;try {a = 10;int b = a/0;//产生异常,执行catch代码System.out.println("try a = " + a);return a;} catch (Exception e) {a = 15;System.out.println("catch a = " + a);return a;} finally {a = 20;System.out.println("finally a =" + a);return a;}}public static void main(String[] args) {int a = getA();System.out.println("result a =" + a);} }
运行结果
catch a = 15 finally a =20 result a =20Process finished with exit code 0