zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    python数据采集与多线程效率分析
    Memcache使用基础
    《大规模 web服务开发》笔记
    画了一张PHPCMSV9的运行流程思维导图
    MySQL的正则表达式
    linux patch 格式与说明(收录)
    Memcached笔记之分布式算法
    bzoj 2120 带修改莫队
    bzoj 2073 暴力
    bzoj 1814 Ural 1519 Formula 1 插头DP
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/12268142.html
Copyright © 2011-2022 走看看