zoukankan      html  css  js  c++  java
  • try-catch-finally中return语句的执行

    catch里return后还会执行finally吗??
    在java里,是的。
    但是值得注意的是,在存在try-catch-finally的方法中,return可能出现的位置有4个,在try中,在catch中,在finally中,在finally后(try-catch-finally外的语句块)。
    在这4个位置都出现return的情况下(事实上应该是不可能的,如果前面3个位置都存在return,那么最后一个位置的return就成了unreachable code,编译不会通过),最终会执行的return应该是finally中的return。也就是finally中的return会覆盖掉其它位置的return。
    但当finally中不存在return,而catch中存在return,但finally中的语句又会对catch中的return的值产生影响时,情况就有点复杂。见下面这个例子:

    int ret = 0;try{ throw new Exception(); }catch(Exception e){ ret = 1; return ret;}finally{ ret = 2; //return ret;}return ret;  

    这里finally中没有return,但是将catch中要return的ret赋值为2.那么最后返回的值是多少?
    是1. 为什么?
    从调试中可以知道Finally中的赋值语句的确被执行了,而执行完这条finally语句后的下一条语句就是catch中的return,那么为啥返回的是1呢?
    查看了一下java language specification 3.0,似乎没有相关情形的描述。
    结合网上的一些相关文章,只能得出一个推断就是在这种情况下(catch中有return,finally中没有return),return的值在执行finally之前已经确定下来了。
    另一个值得注意的是最后的return(位于try-catch-finally外)并没有被执行。

  • 相关阅读:
    Python3之random模块常用方法
    Go语言学习笔记(九)之数组
    Go语言学习笔记之简单的几个排序
    Go语言学习笔记(八)
    Python3之logging模块
    Go语言学习笔记(六)
    123. Best Time to Buy and Sell Stock III(js)
    122. Best Time to Buy and Sell Stock II(js)
    121. Best Time to Buy and Sell Stock(js)
    120. Triangle(js)
  • 原文地址:https://www.cnblogs.com/fjhh/p/5370848.html
Copyright © 2011-2022 走看看