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外)并没有被执行。

  • 相关阅读:
    SpringBoot初识日志
    SpringBoot配置文件(2)
    SpringBoot配置文件(1)
    java8新特性之stream流
    java8新特性之Lambda表达式
    Java入门——第一个Java程序HelloWorld(Dos命令窗口)
    Invalid bound statement (not found): com.xxx.xxx.dao.ShopMapper.insertShop
    2019总结过去,规划未来
    进程和线程的区别
    python(tuple元组、scalar types:数字类型、字符类型、类型转换)
  • 原文地址:https://www.cnblogs.com/fjhh/p/5370848.html
Copyright © 2011-2022 走看看