try-catch里面加了return后,finally还会执行吗?
1.try中添加return,其他地方不添加
public class Mydemo {
public static void main(String[] args) {
System.out.println(test());
}
public static String test() {
String str = "test";
int i=5;
User user = new User();
try {
str = "try";
user.setUserName("张三");
System.out.println("进入try");
return "str:"+str +" 表达式:"+(++i)+" 对象:"+user.getUserName();
} catch (Exception e) {
System.out.println("进入catch");
return "str:"+str +" 表达式:"+(++i)+" 对象:"+user.getUserName();
}finally {
System.out.println("进入finally");
str = "finally";
user.setUserName("王五");
++i;
}
}
}
class User {
private String userName;
@Override
public String toString() {
return "User [userName=" + userName + "]";
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
结果是:
进入try
进入finally
str:try 表达式:6 对象:张三
2.try和finally中添加return,其他地方不添加
public static String test() {
String str = "test";
int i=5;
User user = new User();
try {
str = "try";
user.setUserName("张三");
System.out.println("进入try");
return "str:"+str +" 表达式:"+(++i)+" 对象:"+user.getUserName();
} catch (Exception e) {
System.out.println("进入catch");
return str;
}finally {
System.out.println("进入finally");
str = "finally";
user.setUserName("王五");
return "str:"+str +" 表达式:"+(++i)+" 对象:"+user.getUserName();
}
}
结果是:·
进入try
进入finally
str:finally 表达式:7 对象:王五
3.try,catch和finally中都添加return
public static String test() {
String str = "test";
int i=5;
User user = new User();
try {
str = "try";
user.setUserName("张三");
System.out.println("进入try");
System.out.println(i/0);
return "str:"+str +" 表达式:"+(++i)+" 对象:"+user.getUserName();
} catch (Exception e) {
System.out.println("进入catch");
str = "catch";
user.setUserName("李四");
return "str:"+str +" 表达式:"+(++i)+" 对象:"+user.getUserName();
}finally {
System.out.println("进入finally");
str = "finally";
user.setUserName("王五");
return "str:"+str +" 表达式:"+(++i)+" 对象:"+user.getUserName();
}
}
结果是:
进入try
进入catch
进入finally
str:finally 表达式:7 对象:王五
4.当return在try外面时,在catch中添加return
public static String test() {
String str = "test";
int i=5;
User user = new User();
try {
str = "try";
user.setUserName("张三");
System.out.println("进入try");
System.out.println(i/0);
} catch (Exception e) {
System.out.println("进入catch");
str = "catch";
user.setUserName("李四");
++i
return "str:"+str +" 表达式:"+(++i)+" 对象:"+user.getUserName();
}finally {
System.out.println("进入finally");
str = "finally";
user.setUserName("王五");
++i;
//如果此时在此添加return会编译不通过
}
return "str:"+str +" 表达式:"+(++i)+" 对象:"+user.getUserName();
}
结果是:
进入try
进入catch
进入finally
str:catch 表达式:7 对象:李四
结论:
从上面四个例子可以看出:
- 无论是否会产生catch,都会执行finally中的语句。
- 如果产生catch,且catch中含有return,虽然会执行finally的语句,但返回的值依旧是catch的值,除非finally也有return。
- 如果产生catch,且catch中不含有return,return在函数的最后面,那返回的值将是finally中的值。
- finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值,而是finally的值。
- 如果return在try中,虽然会进入finally,但是因为finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。(例子1中 i 的返回值是6而不是7)。