try catch fianlly执行顺序

今天我们来聊一聊try catch finally执行顺序,一般情况下很容易区分,在实际工作时也不会有非常复杂的情况,但有时候在面试的时候,为了考查面试者的基本功,会特意设计一些非常复杂的情况。该文章就给大家总结一下,它们的执行顺序,希望能帮助到大家。

请看如下例子:

public class TryCatchFinallyExecutionOrderTest {

  @Test
  public void testGetValue1() {
    System.out.println(getValue1());
  }

  public int getValue1() {
    int value = 3;
    try {
      value = 6;
      return value;
    } finally {
      value = 9;
    }
  }
}

输出:6

try执行到return时,将这个要返回的结果存储在一个临时栈中,程序不会立即返回回去,而是会去执行finally语句块,在执行value = 9的时候,程序仅仅只是覆盖了value的值,而不会更新这个临时栈中的值,执行完毕之后,就会通知主程序,finally{}已经执行完毕,可以请求返回了,就会将临时栈的值取出返回。

接下来,我们把上面的例子改动一下:

package com.nightsoul.imaged.mp.backend;

import org.junit.Test;

public class TryCatchFinallyExecutionOrderTest {

  @Test
  public void testGetValue2() {
    System.out.println(getValue2());
  }

  public int getValue2() {
    int value = 3;
    try {
      value = 6;
      return value;
    } finally {
      value = 9;
      return value;
    }
  }
}

输出:9

程序执行finally{}之前的过程和上一下代码一样,但是当它执行finally{}时,value依然会被覆盖,当执行到return value时他将会直接返回value,结束程序。

我再把例子再改一下:

public class TryCatchFinallyExecutionOrderTest {

  @Test
  public void testGetValue3() {
    System.out.println(getValue3());
  }

  public int getValue3() {
    int value = 3;
    try {
      value = 1 / 0;
      return value;
    } catch (Exception e) {
      System.out.println("Error occurs");
      return value;
    } finally {
      value = 9;
      return value;
    }
  }
}

输出:9

这个程序发生了异常,当执行完catch中的异常输出“发生了异常”之后,这个程序依然会继续执行fianlly然后覆盖value,最后再返回value值。

再次修改例子:

public class TryCatchFinallyExecutionOrderTest {


  @Test
  public void testGetValue4() {
    System.out.println(getValue4());
  }

  public int getValue4() {
    int value = 3;
    try {
      value = 1 / 0;
      return value;
    } catch (Exception e) {
      System.out.println("Error occurs");
      return value;
    } finally {
      value = 9;
    }
  }
}

输出:3

catch中的return结果依然会被存储在一个临时栈中,当finally执行完毕之后返回这个值。

通过上面的例子,我们可以得出结论:

  1. 不管有没有出现异常,finally块中代码都会执行;
  2. trycatch中有return时,finally仍然会执行;
  3. finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以方法返回值是在finally执行前确定的;
  4. finally中最好不要包含return,否则程序会提前退出,返回值不再是trycatch块中的返回值。

及时获取更多精彩文章,请扫码关注如下公众号《云原生之家》:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值