finally无论是否遇到return都会被执行

本文探讨了Java中finally代码块与return语句的交互作用,解析了finally块在不同情况下的执行时机及其对return结果的影响,通过实例代码展示了finally块如何在方法返回前执行,以及在包含return语句时如何改变最终的返回值。

finally中的代码块是无论怎样都会被执行的,那么如果遇到return呢,还会被执行吗?

答案是,会的。

return就意味着要结束方法体了,finally又是无论怎样都会被执行的,所以可以认为finally代码块是在返回之前执行的。

上代码:

public class TestsForAny {

    public static void main(String[] args) {

        System.out.println("result of whenFinallyExecute is:"+whenFinallyExecute());
    }

    public static int whenFinallyExecute() {
        int aNumber = 1;
        try {
            System.out.println("try something");
            return ++aNumber;
        }
        catch (Exception e) {
            aNumber = 10;
            System.out.println("catch something");
        }
        finally {
            ++aNumber;
            System.out.println("final" + "Anum is:" + aNumber);
        }
        System.out.println("last block");
        return aNumber;
    }


}

执行结果:

可以看到,finally在return之前被执行了,但是没有对try代码块中的返回结果产生影响。

那try呐,是什么样子的?

上代码:

public class TestsForAny {

    public static void main(String[] args) {

        System.out.println("result of testTryReturn  is:" + testTryReturn ());
    }

    public static int testTryReturn() {
        int aNumber = 1;
        try {
            System.out.println("try something");
            aNumber = aNumber/0;
            return ++aNumber;
        }
        catch (Exception e) {
            ++aNumber;
            System.out.println("catch something");
            return aNumber;
        }
        finally {
            aNumber = aNumber + 10;
            System.out.println("finally");
        }
    }

}

运行结果:

结果是2,说明catch里面的return是会对最终结果产生影响的。

那如果finally里面也有return呢?

上代码:

public class TestsForAny {

    public static void main(String[] args) {

        System.out.println("result of testFinallyReturn is:" + testFinallyReturn());
    }

    public static int testFinallyReturn() {
        int aNumber = 1;
        try {
            System.out.println("try something");
            aNumber = aNumber/0;
            return ++aNumber;
        }
        catch (Exception e) {
            ++aNumber;
            System.out.println("catch something");
            return aNumber;
        }
        finally {
            aNumber = aNumber + 10;
            System.out.println("finally");
            return aNumber;
        }
    }

}

运行结果:

结果为12,finally里面有return,就可以影响最终结果了、

所以,finally最终总是会被执行,在finally之前遇到return会在先执行finally然后return,并且不会对return结果产生影响。如果在finally之后遇到return或者finally中本身包含return,是可以对结果产生影响的。

 

 

<think>首先,用户的问题是:“我想了解在Java异常处理中return语句和finally块的执行顺序 请问Java面试题:return语句和finally块哪个先执行” 根据系统级指令,我需要使用中文回答,结构清晰,逐步解决问题。回答必须真实可靠,基于提供的引用。 回顾引用内容: - 引用[1]:显示了一个Java代码示例,其中try块有returnfinally块修改了变量,但输出是2。这表明finally块在return之后执行?不,引用解释:finally块在return之前执行,但变量修改不影响基本数据类型的返回值。 - 引用[2]:解释了try-catch-finally执行顺序。如果没有异常,执行try块,然后finally块;如果有异常,执行catch块,然后finally块。如果finally中有return,它会覆盖之前的return。 - 引用[3]:详细总结了三种情况: 1. 如果finallyreturn,它会覆盖try或catch中的return。 2. 如果finally没有return,也没有改变返回值,则执行try或catch的return。 3. 如果finally改变了返回值: - 对于基本数据类型,改变不起作用。 - 对于引用数据类型,改变属性值起作用。 - 引用[4]:类似地,强调如果返回具体值,finally中的改变可能覆盖,但示例中返回2,因为基本数据类型在finally修改后不影响。 关键点:finally块总是在try或catch块之后执行,无论是否return或异常。return语句在try或catch中执行时,会先计算返回值,然后执行finally块,最后实际返回。 在Java中,执行顺序是: - 如果try块正常执行,遇到return,它会先计算返回值(例如,存储在一个临时变量中),然后执行finally块。 - 如果finally块修改了变量,但返回值是基本数据类型,则修改不影响已存储的返回值。 - 如果finally块有return,它会覆盖之前的return。 所以,回答用户问题:在Java中,finally块在return语句执行之后执行,但return语句的执行包括计算返回值,然后finally执行,最后方法返回。 更精确地说: - return语句在try块中执行时,它会设置返回值,但方法不会立即返回;finally块总是被执行,之后方法才返回。 因此,finally块在return语句之后执行,但return的效果(实际返回)在finally之后。 从用户视角:return语句和finally块哪个先执行?实际上,return语句先开始执行(计算返回值),但finally块在return语句完成之前插入执行,然后方法返回。 引用[3]总结得很好:try语句在返回前,将其他所有的操作执行完,保留好要返回的值,然后执行finally中的语句。 所以,在顺序上: 1. 执行try块中的代码。 2. 遇到return时,计算返回值并存储。 3. 执行finally块。 4. 如果finally没有return,则返回存储的值;如果finallyreturn,则返回finally中的值。 现在,构建回答: - 先解释一般规则。 - 然后使用示例说明。 - 最后,基于引用总结。 回答结构: 1. 介绍Java异常处理中finally块的作用:finally块总是执行,无论是否发生异常或有return。 2. 解释return语句和finally块的执行顺序。 3. 分析不同情况: - 没有finally中的return。 - 有finally中的return。 - 返回值类型的影响。 4. 提供代码示例。 5. 总结关键点。 生成相关问题:根据指令,我需要生成相关问题。相关问题应基于当前主题。 相关问题建议: 1. 如果在finally块中抛出异常会发生什么? 2. 为什么finally块中的return会覆盖try块中的return? 3. 在Java中,finally是否总是执行?有什么例外? 4. 如何避免finally块中的常见错误? 最后,确保使用中文,行内数学表达式用$...$,但这里可能不需要数学表达式。独立公式如果有,用$$...$$,但Java代码可能不需要。 在回答中,引用末尾添加引用标识,如[^1]。</think>### Java异常处理中return语句和finally块的执行顺序 在Java异常处理中,`finally`块总是会执行,无论`try`或`catch`块中是否发生异常或包含`return`语句。关于`return`语句和`finally`块的执行顺序,核心规则是:**`finally`块在`return`语句之后开始执行,但实际返回操作(方法退出)发生在`finally`块执行完毕之后**。更精确地说: - 当`try`或`catch`块中遇到`return`语句时,Java会先计算返回值并将其存储在一个临时变量中(保留返回值),但不会立即退出方法。 - 然后,程序无条件执行`finally`块中的代码。 - 最后,方法才根据之前存储的返回值(或`finally`中的新返回值)实际退出。 这个过程确保了`finally`块的代码(如资源清理)总能执行,但返回值的行为受`finally`块内容的影响。下面分情况详细说明: #### 1. **`finally`块中没有`return`语句** - **返回值类型为基本数据类型(如`int`, `double`)或字符串**:`finally`块中对变量的修改**不会影响**已存储的返回值。因为返回值在进入`finally`前已计算并存储。 - 示例代码: ```java public static int test() { int i = 0; try { i = 2; return i; // 返回值2存储到临时变量 } finally { i = 3; // 修改i,但不影响返回值 System.out.println("finally执行, i=" + i); } } // 调用test()返回2, 输出"finally执行, i=3" ``` **结果:2**。因为返回值是基本类型,`finally`中的修改无效[^1][^3]。 - **返回值类型为引用数据类型(如对象)**:`finally`块中对对象属性的修改**会影响**返回值,因为存储的是对象引用。 - 示例代码: ```java public static StringBuilder test() { StringBuilder sb = new StringBuilder("A"); try { sb.append("B"); return sb; // 存储sb的引用 } finally { sb.append("C"); // 修改对象属性 System.out.println("finally执行, sb=" + sb); } } // 调用test()返回"ABC", 输出"finally执行, sb=ABC" ``` **结果:"ABC"**。因为引用类型返回的是地址,`finally`中的修改通过引用生效[^3]。 #### 2. **`finally`块中有`return`语句** - `finally`中的`return`会**覆盖**`try`或`catch`块中的返回值,无论原返回值是基本类型还是引用类型。 - 示例代码: ```java public static int test() { try { return 2; // 返回值被忽略 } finally { return 3; // 覆盖返回值 } } // 调用test()返回3 ``` **结果:3**。因为`finally`中的`return`优先执行,原`try`中的返回值被丢弃[^2][^4]。 #### 关键总结 - **执行顺序**:`try`/`catch`中的代码 → 遇到`return`时计算并存储返回值 → 执行`finally`块 → 方法实际返回(使用存储值或`finally`的新值)。 - **最佳实践**:避免在`finally`中使用`return`,因为它会掩盖`try`/`catch`中的异常或返回值,导致调试困难[^3][^4]。 - **异常情况**:如果`finally`块中抛出异常,它会覆盖`try`/`catch`中的异常或返回值,成为最终结果。 ### 相关问题 1. 如果在`finally`块中抛出异常,会对`try`块中的返回值或异常产生什么影响? 2. 为什么Java设计`finally`块总是在`return`之后执行?这有什么好处? 3. 在资源清理场景中,`try-with-resources`与`finally`块有何区别? 4. 如何避免`finally`块中的常见错误,例如覆盖返回值或抛出异常?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值