• try catch finally语句块中存在return语句时的执行情况剖析


    2种场景

    (1) try中有return,finally中没有return(注意会改变返回值的情形);
    (2) try中有return,finally中有return;

    场景代码分析(idea亲测)

    场景一:

     1 //实例一:try中有return,finally中没有return
     2 public class TryReturnFinally {
     3     public static void main(String[] args) {
     4         System.out.println(test());
     5     }
     6     private static int test(){
     7         int num = 10;
     8         try{
     9             System.out.println("try");
    10             return num += 80;
    11         }catch(Exception e){
    12             System.out.println("error");
    13         }finally{
    14             if (num > 20){
    15                 System.out.println("num>20 : " + num);
    16             }
    17             System.out.println("finally");
    18         }
    19         return num;
    20     }
    21 }

    run:

    try
    num>20 : 90
    finally
    90

    实例二:

     1 //实例二:try中有return,finally中没有return,但是会改变返回值的情况
     2 public class TryReturnFinally {
     3     public static void main(String[] args) {
     4         System.out.println(test());
     5     }
     6     private static int test(){
     7         int num = 10;
     8         try{
     9             System.out.println("try");
    10             return num;
    11         }catch(Exception e){
    12             System.out.println("error");
    13         }finally{
    14             if (num > 20){
    15                 System.out.println("num>20 : " + num);
    16             }
    17             System.out.println("finally");
    18             num = 100;
    19         }
    20         return num;
    21     }
    22 }

    run:

    try
    finally
    10

    过程剖析:当程序执行到try语句块中的return方法时,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally语句块中的程序, 在执行"num = 100"时,程序仅仅是覆盖了num的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。

    场景二:

     1 //try中有return,finally中有return
     2 public class TryReturnFinally {
     3     public static void main(String[] args) {
     4         System.out.println(test());
     5     }
     6     private static int test(){
     7         int num = 10;
     8         try{
     9             System.out.println("try");
    10             return num += 80;
    11         }catch(Exception e){
    12             System.out.println("error");
    13         }finally{
    14             if (num > 20){
    15                 System.out.println("num>20 : " + num);
    16             }
    17             System.out.println("finally");
    18             num = 100;
    19             return num;
    20         }
    21     }
    22 }

    run:

    1 try
    2 num>20 : 90
    3 finally
    4 100

    总结:

    流程是先运行try内部代码,判断finally中是否有return,
    如果有,那么就不执行try中的return,继续执行finally中的代码
    如果没有,那么先执行finally中代码,再执行try的return。

    参考:

    https://blog.csdn.net/yingshuanglu2564/article/details/82593916

    https://www.jianshu.com/p/75a93408b5f8

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    Idea中SpringBoot热部署搭建
    Redis 集群搭建
    centos7 vsftp搭建
    Centos 7 安装jdk
    Centos7 安装nginx
    Xshell 连接Linux
    python 的mysql 操作
    NIO/BIO
    java基础-3
    java基础-2
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/12268142.html
Copyright © 2020-2023  润新知