关于try,finally异常。finally一定会执行吗?
关于try,finally。finally一定会执行吗?
答案肯定不是。
先看一下结论: (1)当出现在try之前就有结果返回,也就是有return时,则不会往下执行。 (2)当try之中出现异常时,会执行catch语句,然后是finally;当try中有return时,会将结果返回给finally,然后看finally中是否还有返回语句,如果有则将finally中的结果返回,finally中没有返回语句则将try中的返回语句返回。
进入正文 以案例来说明:
- try之前就结果返回
public class Demo01 { private static int test() { int i = 1; if (i == 1) { return i; } try { System.out.println("执行try"); } finally { System.out.println("执行finally"); } return 0; } public static void main(String[] args) { System.out.println("执行main:" + test()); } }
结果如下:
解释:因为try之前已经return,所以程序中的方法后边就不执行了。也就是finally也不会执行。
- try中有异常
public class Demo02 { private static int test02() { try { System.out.println("执行try"); return 1 / 0; } catch (Exception e) { System.out.println("执行catch"); return 11; } finally { System.out.println("执行finally"); } } public static void main(String[] args) { System.out.println("执行main:" + test02()); } }
结果如下:
解释:因为try之前没有return,先执行try,try中有异常,执行catch并将结果11返回给主线程,最后执行finally
- try中有返回语句
public class Demo03 { private static int test03() { int i = 0; try { System.out.println("执行try:" + i); return i; } finally { ++i; System.out.println("执行finally:" + i); } } public static void main(String[] args) { System.out.println("执行main:" + test03()); } }
结果如下:
解释:因为try之前没有return,先执行try,try中有返回,将其返回给finally,最后执行finally,此时i为0,++i之后为1,最后返回主线程是try中返回的i,所以主线程中的值是0。
- try和finally中都有返回语句
public class Demo04 { private static int test04() { try { System.out.println("执行try"); return 1; } finally { System.out.println("执行finally"); return 2; } } public static void main(String[] args) { System.out.println("执行main:" + test04()); } }
结果如下:
解释:因为try之前没有return,先执行try,try中有返回,将其返回给finally,最后执行finally,finally中有返回语句,则直接将其返回给主线程,所以主线程最终值为2。
- try和finally中都有返回语句(对第四点的深入理解)
public class Demo05 { private static int test05() { int i = 1; try { System.out.println("执行try:" + i); i++; return i; } finally { ++i; System.out.println("执行finally:" + i); return i; } } public static void main(String[] args) { System.out.println("执行main:" + test05()); } }
结果如下:
解释:在第四点的基础上自己可以解释了,就不啰嗦了
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
主成分分析(降维)案例介绍