finally+finally执行时机

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

正常 都知道try或catch执行后 就会执行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值。

结论

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的是那个值呢?(以前关注这个问题 是在牛客网上刷题遇到的)

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

最后

凡心所向,素履以往。

posted @ 2021-01-11 09:19  cnng  阅读(208)  评论(0编辑  收藏  举报