finally+finally执行时机


前两天看了篇文档,里面讲解了finally的执行情况和返回值的情况。讲的还挺细致,既回忆复习了一下基础也新学到了一些之前没有注意的知识点,稍作整理,分享给大家。

finally的特点

被finally控制的语句体一定会执行(这是我们平时的认知)

But 请注意

finally不会被执行的几种情况:

在try前制造一个异常(或直接return) 不走进try里面 finally自然也就不会执行了

特殊情况在执行到finally之前jvm退出了(比如System.exit(0)–这是退出java虚拟机)

进了try finally都会执行 只要你不这样System.exit(0)

这是finally的特点,这些其实一般也都记得住,正常 都知道try或catch执行后 就会执行finally中的语句,但是如果try中有return catch里面有return,finally的执行顺序呢?还有如果try/catch/finally都有return 那最后到底return的是那个值呢?(以前关注这个问题 是在牛客网上刷题遇到的)

finally的执行顺序

try中有return:

public class TryCatchTest {

  private static int total() {
    try {
      System.out.println("执行try");
      return 11;
    } finally {
      System.out.println("执行finally");
    }
  }

  public static void main(String[] args) {
    System.out.println("执行main:" + total());
  }
}

输出结果:
执行try
执行finally
执行main:11

结论:finally块执行在try块的return之前

try/catch中有return语句:

public class TryCatchTest {

  private static int total() {
    try {
      System.out.println("执行try");
      return 1 / 0;
    } catch (Exception e) {
      System.out.println("执行catch");
      return 11;
    } finally {
      System.out.println("执行finally");
    }
  }

  public static void main(String[] args) {
    System.out.println("执行main:" + total());
  }
}

输出结果:
执行try
执行catch
执行finally
执行main:11

同样的,finally执行在catch块return的执行前

结论:finally在try/catch后执行,如果try/catch中有return语句,finally在return前执行

finally块中的返回值

1.finally块不含返回值,但是可以改变变量值

看一个例子:

public class TryCatchTest {

  private static int total() {
    int i = 0;
    try {
      System.out.println("执行try:" + i);
      return i;
    } finally {
      ++i;
      System.out.println("执行finally:" + i);
    }
  }

  public static void main(String[] args) {
    System.out.println("执行main:" + total());
  }
}

//输出结果:
//执行try:0
//执行finally:1
//执行main:0

我们经过前面的分析,finally块的执行时机应该是return之前,那理论上我们应该先++i使得i等于1,在执行return i; 自然会返回1。

可是结果却返回了0,这是因为Java程序会把try或者catch块中的返回值保留,也就是暂时的确认了返回值,然后再去执行finally代码块中的语句。等到finally代码块执行完毕后,如果finally块中没有返回值的话,就把之前保留的返回值返回出去。

2.finally中含有返回值

示例1:
public class TryCatchTest {

  private static int total() {
    try {
      System.out.println("执行try");
      return 1;
    } finally {
      System.out.println("执行finally");
      return 2;
    }
  }

  public static void main(String[] args) {
    System.out.println("执行main:" + total());
  }
}
//输出结果:
//执行try
//执行finally
//执行main:2

结论:finally 中有 return 语句,这个返回值将会覆盖前面(try/catch)中的返回值

示例2:
public class TryCatchTest {

  private static int total() {
    int i = 1;
    try {
      System.out.println("执行try:" + i);
      return i;
    } finally {
      ++i;
      System.out.println("执行finally:" + i);
      return i;
    }
  }

  public static void main(String[] args) {
    System.out.println("执行main:" + total());
  }
}
//输出结果:
//执行try:1
//执行finally:2
//执行main:2

结论:finally中的return 在try/catch中的return执行后 再执行,所以finally中有 return语句,这个返回值将会覆盖前面(try/catch)中的返回值

示例3:
public class TryCatchTest {

  private static int total() {
    int i = 1;
    try {
      System.out.println("执行try:" + i);
    } finally {
      ++i;
      System.out.println("执行finally:" + i);
    }
    return i;
  }

  public static void main(String[] args) {
    System.out.println("执行main:" + total());
  }
}
//执行结果:
//执行try:1
//执行finally:2
//执行main:2

finally块之后的方法有return,则return的值就是进行完上面的操作后的return值。

Try/catch finally 关于return问题

try/catch中有return语句, finally里中的代码会在return前执行finally里面的代码

try/catch中有return语句,finally 中的return 在try/catch中的return语句执行后再执行,finally 中的return 语句,这个返回值将会覆盖try/catch中的返回值。

finally块之后的方法有return,则return的值就是进行完上面的操作后的return值。

最后

凡心所向,素履以往,生如逆旅,一苇以航。送给你,也送给我,送给所有努力的人。

一直向着东方走,收获的那一刻,真的很美。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值