直接上例子吧
public class test {
public static String fun() {
String result = "hello";
try {
result = "1";
System.out.println("try");
return result;
} catch (Exception e) {
result = "2";
System.out.println("catch");
return result;
} finally {d
result = "3";
System.out.println("finally");
//return result;
}
}
public static void main(String[] args) {
System.out.println(fun());
}
}
结果为
try
finally
1
- finally执行了,但是修改result没有生效,原因:执行try后,暂存其return值,但不影响String类型
- 将finally中的return打开,返回修改后的值3
- 将result修改成基本数据类型结果一致
public class test {
static class Person{
private String name;
private int age;
public Person() {
name = "lucy";
age = 20;
}
}
public static Person fun() {
Person p = new Person();
try {
p.name = "jack";
p.age = 21;
System.out.println("try");
return p;
} catch (Exception e) {
p.name = "mike";
p.age = 22;
System.out.println("catch");
return p;
} finally {
p.name = "Lily";
p.age = 23;
System.out.println("finally");
//return p;
}
}
public static void main(String[] args) {
System.out.println(fun().name);
System.out.println(fun().age);
}
}
如果改为引用数据类型,try中return暂存的是指向堆中对象的引用地址(JVM栈中的),如果返回值是对象,则finally中的语句,仍会根据地址的副本,改变原对象的值