网上很多人说finally的执行顺序在return之前,我认为这种说法并不是很准确
准确的来说finally是在return将要返回之前(此时若返回的是基本数据类型,那么记录下来它的值,如果是引用数据类型则记录下来这个时候的地址)执行的
可以参考下面代码的结果
public static void main(String[] args) { int test = test(3,5); System.out.println(test); } public static int test(int x, int y){ int result = x; try{ if(x<0 || y<0){ return 0; } result = x + y; return result; }finally{ result = x - y; } }
上面的结果返回的结果是8
为什么是8而不是-2,是因为java的传递机制是值传递,return 的时候复制了数据的值
此时也证明了(开头的那句话)虽然result最终的值变成了-2,但是我们当时记录要返回
的值是原来已经复制过的。
再次总结一句
return的时候是复制了一个变量然后返回,所以之后finally操作的变量如果是基本类型的话不会影响返回值。
但是如果返回值是引用类型的话,因为指向同一个对象所以还是有影响的。