关于try finally 中的return语句的问题

在try的括号里面有return一个值,那在哪里执行finally里的代码?



     首先,不论如何,肯定的是finally是在return之前执行的。具体有:

情况一:return的是基本数据类型,这个时候如果finally中没有return语句,则以try中的为准,若finally中有return,则会覆盖try中的return。

       对于try中的return语句,return执行到中间的时候发现finally,则先不返回,而是把值先暂存到本地栈,等finally运行之后再返回,如果finally里也有返回语句,那么以finally为主,否则才把本地栈里的返回值真的返回。

      

	public static void main(String[] args) {
		
         int a = Test.getNubmer();
         System.out.println(a);
	}
	
	public static int getNubmer(){
		int b;
		try {
			b = 5;
			return b;
		} finally {
			
			b = 8;
//			return b;
		}
		
	}
运行结果为:5

public static void main(String[] args) {
		
         int a = Test.getNubmer();
         System.out.println(a);
	}
	
	public static int getNubmer(){
		int b;
		try {
			b = 5;
			return b;
		} finally {
			
			b = 8;
			return b;
		}
		
	}

运行结果为:8


情况二:return的是引用类型,这个时候不论finally中有没有return语句,他都会覆盖try中的内容。比如:

public static void main(String[] args) {		   
         System.out.println(Test.getUser().getName());
	}
	
	public static User getUser(){
		User user = new User();
		
		try {
			user.setName("张三");
			return user;
		} finally {
			user.setName("李四");
			System.out.println("我被执行了");
//			return user;
		}
不论是否有注释掉的return,执行结果都是:李四


另外:

public static void main(String[] args) {		   
		 System.out.println(getUser());
	}
	
	public static String getUser(){
		String s = null;
		
		try {
			s="222";
            System.out.println(s);
            return s;
		} finally {
			s="111";
            System.out.println(s);
			return s;
		}
		
	}

执行结果:

222

111

111

public static void main(String[] args) {		   
		 System.out.println(getUser());
	}
	
	public static String getUser(){
		String s = null;
		
		try {
			s="222";
            System.out.println(s);
            return s;
		} finally {
			s="111";
            System.out.println(s);
//			return s;
		}

执行结果为:

222

111

222


另外:

public class TestDemo
{
    public static String output = "";
    public static void foo(int i)
    {
        try
        {
            if (i == 1)
            {
                throw new Exception();
            }
        }
        catch (Exception e)
        {
            output += "2";
            return ;
        } finally
        {
            output += "3";
        }
        output += "4";
    }
    public static void main(String[] args)
    {
        foo(0);
        foo(1);
        System.out.println(output);
    }
}

运行结果是:3423

解析:本题与上面不同的主要原因,还在于本题中的output为static。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值