本文共 4360 字,大约阅读时间需要 14 分钟。
package com.zte.lzz.leetcode.tryCatchFinally;/** * try-catch-finally 执行顺序及finally修改属性值问题总结 */public class TryCatchFinallyDemo { public static void main(String[] args) { System.out.println(show01()); System.out.println("-----------------------------------"); System.out.println(show02()); System.out.println("-----------------------------------"); System.out.println(show03()); System.out.println("-----------------------------------"); System.out.println(show04()); System.out.println("-----------------------------------"); System.out.println(show05()); System.out.println("-----------------------------------"); TryCatchFinallyDemo demo = new TryCatchFinallyDemo(); System.out.println(demo.m1().toString()); System.out.println("-----------------------------------"); System.out.println("-----------------------------------"); System.out.println(demo.m2().toString()); System.out.println("-----------------------------------"); System.out.println(demo.m3().toString()); } public static int show01() { try { return 1; }finally{ System.out.println("finally模块被执行,01"); } } public static int show02() { try { int a = 8/0; return 1; }catch (Exception e) { return 2; }finally{ System.out.println("finally模块被执行,02"); } } public static int show03() { try { int a = 8/0; return 1; }catch (Exception e) { return 2; }finally{ System.out.println("finally模块被执行,03"); return 0; } } public static int show04() { int result = 0; try { return result; }finally{ System.out.println("finally模块被执行,04"); result = 1; } } public static Object show05() { Object obj = new Object(); try { return obj; }finally{ System.out.println("finally模块被执行,05"); obj = null; } } public LOl m1(){ LOl lOl = new LOl(); try { return lOl; }finally { System.out.println("finally模块被执行,m1"); lOl = null; } } public LOl m2(){ LOl lOl = new LOl(); try { lOl.setAge(20); lOl.setName("jack"); return lOl; }finally { System.out.println("finally模块被执行,m2"); lOl.setAge(25); lOl.setName("rose"); } } public LOl m3(){ LOl lOl = new LOl(); try { lOl.setAge(20); lOl.setName("jack"); return lOl; }finally { System.out.println("finally模块被执行,m3"); lOl.setAge(25); lOl.setName("rose"); return lOl; } } class LOl{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "LOl{" + "name='" + name + '\'' + ", age=" + age + '}'; } }}
finally模块被执行,011-----------------------------------finally模块被执行,022-----------------------------------finally模块被执行,030-----------------------------------finally模块被执行,040-----------------------------------finally模块被执行,05java.lang.Object@18769467-----------------------------------finally模块被执行,m1LOl{name='null', age=0}----------------------------------------------------------------------finally模块被执行,m2LOl{name='rose', age=25}-----------------------------------finally模块被执行,m3LOl{name='rose', age=25}Process finished with exit code 0
结果及结论:
执行顺序:
1,finally无return,执行完finally代码,再执行try或者catch里面return
2,finally有return,执行finally里面return,不再执行try或者catch里面return
finally修改值问题:
3,如果在执行finally块前出现return语句,会把在值先缓存起来,等执行完finally块后,再返回缓存起来的值。
4,如果是返回基本类型的值,那么在缓存时也是缓存值本身,所以后面在finally块中重新赋值时,方法返回的值不会受finally块中重新赋值的影响;
如果返回的是引用类型的值,那么在缓存时,缓存的是引用类型对象的引用,所以虽然后面在finally块中重新赋值时(重新指向另一个对象),方法返回的值不会受到影响,但是如果是修改对象的属性,那么会影响到返回的值。
参考博客: 与
转载地址:http://zxwci.baihongyu.com/