首先 finally 中的内容必然会执行(除去停电以及 System.exit(); 等不可控因素)
public class Test {
public static void main(String[] args)
{
try
{
System.out.println("Start");
System.exit(0);
}finally
{
System.out.println("Finally");
}
System.out.println("End");
}
}
输出结果:
Start
那么当finally遇上return呢??
public class Test {
public static void main(String[] args) {
System.out.println(sum());
}
public static int sum() {
int c = 0;
try {
int a = 10;
int b = 20;
c = a + b;
return c;
} catch (Exception e) {
} finally {
c = 100;
}
return -1;
}
}
输出结果:
30
再看另外一个例子:
public class Test {
public static void main(String[] args) {
Person p = getAge();
System.out.println(p.age);
}
public static Person getAge() {
Person p = new Person();
int c = 0;
try {
p.age = 10;
return p;
} catch (Exception e) {
} finally {
p.age = 20;
}
return null;
}
}
class Person {
int age;
}
输出结果:
20
什么原因呢?其实是 return 在finally执行之前保存了返回值的引用,例如return 30就是30这个数字对应的引用而return p.age; 保存的就是 p.age的引用,所以在finally中更改c的值不会导致return的值改变,而更改p.age的值会导致return的值发生改变
![](https://img.haomeiwen.com/i14757674/c4a2d22ddc6772cc.png)
网友评论