你看这代码最后输出值多少?

    技术2022-07-12  72

    作为一名java程序员,在求职面试时,时常会遇到我们平时很少留意的题目。类似这样的题目在平时实际开发中我们很少留意,而面试时出现这样的问题,一般是考察求职者的基础是否扎实。

    小编以前面试时,就遇到这样一个问题:

    try-catch-finally 中,如果catch 中 return 了,finally 还会执行吗?

    很显然,答案是肯定会执行,在 return 前执行。

    我们写个简单例子来验证下

    1public class FinallyTest { 2 public static void main(String[] args) { 3    int k = getResult(); 4    System.out.println("k值:" + k); 5 6    k = getResult2(); 7    System.out.println("k值:" + k); 8 9} 10 11public static int getResult() { 12    int k = 10; 13    try { 14        k = 100 / 0; 15    } catch (Exception ex) { 16        return k; 17    } finally { 18        k = 30; 19    } 20    return k; 21} 22 23public static int getResult2() { 24    int k = 10; 25    try { 26        k = 100 / 0; 27    } catch (Exception ex) { 28        return k; 29    } finally { 30        k = 30; 31        return k; 32    } 33  } 34}  

    在16行中

    这里return 10,返回路径已生成

    但发现后面还有finally,于是继续执行finally的内容,k=30

    再次回到步骤1,继续走return 10,形成返回路径之后,这里的k就不是变量k,而是常量10

    在31行中

    如果在finally,又重新形成了一条返回路径,由于只能有1个return返回,所以直接返回30

    最后输出的结果是:

    k值:10

    k值:30

    关于在finally块中使用return,在 阿里巴巴Java开发手册-异常处理 有这样的描述:

    因为如果存在 finally 代码块,try中的 return 语句执行成功后,并不会立马返回调用者,而是继续执行finally块中的语句,如果此处存在return语句,(立即结束语句)的优先级最高,程序会优先返回finally语句块中的立即结束语句的结果,此时try-catch语句块中的return/抛出异常,程序员结束。很显然,在 finally 中返回或者修改返回值会对程序造成很大的困扰。

    总结:

    在平时编写代码时,要避免在 finally 语句块中使用 return 语句。

    由于笔者水平有限,文中纰漏之处在所难免,权当抛砖引玉,不妥之处,请大家批评指正。

    -END-

    作者:洪生鹏  技术交流、媒体合作、品牌宣传请加作者微信: hsp-88ios

    猜你喜欢

    知名公司面试题:谈谈你对volatile关键字的理解

    更多惊喜,请长按二维码识别关注

    Processed: 0.010, SQL: 11