zoukankan      html  css  js  c++  java
  • try catch 语句中有return 的各类情况

    在牛客上做java题时遇到过多到关于try catch语句的问题,看了很多答案解析,在这里记录一下。

    首先给出一道题目:

    下面代码的运行结果为?


    A、catch语句块 和是43

    B、编译异常

    C、finally语句块 和是43

    D、和是43 finally语句块

    正确答案:C

    由于学习过编译原理的课程,知道了System.out.println中要执行add()方法与前面的“和是”字符串拼接后才会输出,因此首先执行add()方法。

    add()方法中try语句块中有return语句,那么是否执行完try语句块就直接退出方法了呢?

    上述代码在Eclipse下运行此代码结果为:

     

    看来尽管try语句块中有return,还是会执行finally语句块。

    看到了合理的解释是,在try中执行到return语句时,不会真正的return,即只是会计算return中的表达式(本题为执行a+b),之后将结果保存在一个临时栈中,接着执行finally中的语句,最后才会从临时栈中取出之前的结果返回。

    下面我们在这道题的finally语句中加入这么一行代码:

    a=1;


    结果如何呢?

    下面是运行结果截图:

    从结果看出来结果并没有发生改变,这也验证了finally中的语句不会影响到临时栈中的值,即在执行finally之前,临时栈中的值已经确定为43了,执行finally语句将a的值变为1,对结果没有产生影响,执行完finally后的输出结果仍为43.

    有了这些认识之后,我们讨论一下try,catch,finally中有return语句的几种情况。

    第一种:try{}catch(){}finally{}return;

    该情况语句后顺序执行。(不考虑异常)

    第二种:try{return;}catch(){}finally{}return;

    该情况为刚才说的题目情况,即执行完try语句块,将return的值保存在临时栈中,再执行finally语句块,之后返回临时栈中的值。

    第三种:try{}catch(){return;}finally{}return;

    无异常:执行try,执行finally,再执行return;

    有异常:执行完catch语句块,将return的值保存在临时栈中,再执行finally语句块,之后返回临时栈中的值。

    第四种:try{}catch(){}finally{return;}

    执行finally中的return语句。

    第五种:try{return;}catch(){return;}finally{};

    根据有无异常执行和情况二或情况三。

    第六种:try{return;}catch(){}finally{return;}

    执行完try语句块,将return的值保存在临时栈中,再执行finally语句块,因为finally中有return,所以返回finally中的return值。

    第七种:try{}catch(){return;}finally{return;}

    执行完catch语句块,将return的值保存在临时栈中,再执行finally语句块,因为finally中有return,所以返回finally中的return值。

    第八种:try{return;}catch(){return;}finally{return;}

    有异常:执行情况七。

    无异常:执行情况六。

    注意:finally中最后不要有return语句,在编译器中会报警告。

    总结:

    在正常情况(即程序正常执行try catch finally语句块,不会在语句中出现退出程序、线程终止等特殊情况)下,都会执行finally语句块,如果finally中有return,则程序会走finally中的return,如果没有,则先执行try或者catch中的return,将其存入临时栈中,执行完finally语句后才返回临时栈中的值。

    原文链接:https://blog.csdn.net/qq_30816657/article/details/80297646

  • 相关阅读:
    数据挖掘、数据分析的书籍推荐
    跳槽时间如何选择
    求职网站总结
    Eclipse中Applet程序运行时Applet小程序大小的设置
    统计学习导论:基于R应用——第五章习题
    统计学习导论:基于R应用——第四章习题
    统计学习导论:基于R应用——第三章习题
    Windows环境下安装IPython NoteBook
    centos7上mysql无法启动也没有日志
    CentOS 6.4下Squid代理服务器的安装与配置
  • 原文地址:https://www.cnblogs.com/isme-zjh/p/11411279.html
Copyright © 2011-2022 走看看