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 对象:李四

结论:

从上面四个例子可以看出:

  1. 无论是否会产生catch,都会执行finally中的语句。
  2. 如果产生catch,且catch中含有return,虽然会执行finally的语句,但返回的值依旧是catch的值,除非finally也有return。
  3. 如果产生catch,且catch中不含有return,return在函数的最后面,那返回的值将是finally中的值。
  4. finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值,而是finally的值。
  5. 如果return在try中,虽然会进入finally,但是因为finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。(例子1中 i 的返回值是6而不是7)。
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值