记录一下try/catch/finally的执行,总有点混淆:
- 先测试基本类型
private static int test1(){
int i = 1;
try {
return i;//①第一步执行
}catch (Exception e){
e.printStackTrace();
}finally {
i = 0;//②第二步执行,执行完后再执行①
}
return i;//不执行
}
private static int test2(){
int i = 1;
try {
return i;//①第一步执行
}catch (Exception e){
e.printStackTrace();
}finally {
i = 0;//②第二步执行
return i;//③第三步执行
}
}
- 测试引用类型
private static User test3(){
User user = new User("张三");
try {
return user;
}catch (Exception e){
e.printStackTrace();
}finally {
user = new User("李四");
}
return user;
}
private static User test4(){
User user = new User("张三");
try {
return user;
}catch (Exception e){
e.printStackTrace();
}finally {
user.setName("李四");
}
return user;
}
class User{
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
System.out.println("test1返回:"+test1());//结果:1
System.out.println("test2返回:"+test2());//结果:0
System.out.println("test3返回:"+test3());//结果:User{name='张三'}
System.out.println("test4返回:"+test4());//结果:User{name='李四'}
}
总结:
1. 无论try执行什么,finally都会执行;
2. 如果在try中执行了return语句,在执行finally之前会将return的结果保存下来,即使在finally中重新赋
值,仍然以try中保存的值 返回,但如果是引用类型,在finally中修改了原来对象中的值,以修改后的值
返回;
3.如果try和finally中都有return,直接返回finally中的值