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

本文详细解释了在Java中return语句与finally块之间的交互作用,包括不同情况下finally块如何影响return的值,特别是当返回基本类型和引用类型时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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。


### Python `try` 和 `finally` 块中都包含 `return` 语句的情况及执行顺序 在 Python 中,当 `try` 和 `finally` 块中都存在 `return` 语句时,程序的执行顺序如下: - 首先执行 `try` 块内的代码。一旦遇到 `return` 语句,该语句会被暂存起来,但并不会立即返回函数调用方。 - 接着控制权转移到 `finally` 块,无论之前是否发生了异常或遇到了 `return` 语句,都会无条件地执行此部分的内容。 - 如果 `finally` 块内也含有 `return` 语句,则会覆盖掉前面由 `try` 或者其他地方保存下来的任何即将要被返回的数据,并且此时才会真正地把新的作为整个函数的结果传递给外部环境。 因此,在这种情况下,最终只会有一个来自 `finally` 的返回传出去[^1]。 下面给出一段具体的例子来展示这一行为特性: ```python def example_function(): try: print("Executing inside the try block.") return "Return from try" finally: print("Executing inside the finally block.") return "Return from finally" if __name__ == "__main__": result = example_function() print(f"The function returned: {result}") ``` 运行上述代码将会输出: ``` Executing inside the try block. Executing inside the finally block. The function returned: Return from finally ``` 这表明即使 `try` 块中有自己的 `return` 语句,只要 `finally` 同样定义了一个 `return` ,那么后者总是能够决定最后实际返回什么内容给外界。 得注意的是,对于某些编程语言来说(比如 Java),它们可能有不同的处理机制;但对于 Python 而言,就是按照上面描述的方式来工作的[^2]。 #### 特殊情况说明 另外还需注意一点:如果 `try...except...else...finally` 结构中的任何一个分支已经包含了 `return` 操作,而之后又进入了带有自己 `return` 的 `finally` 分支,那么同样遵循前述原则——即以 `finally` 内部指定的那个为准[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值