热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【转】有return的情况下trycatchfinally的执行顺序

为什么80%的码农都做不了架构师?结论:1、不管有木有出现异常,finally块中代码都会执行;2、当try和catc

为什么80%的码农都做不了架构师?>>>   hot3.png

结论:

1、不管有木有出现异常,finally块中代码都会执行;

2、当try和catch中有return时,finally仍然会执行;

3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

举例:

情况1:try{} catch(){}finally{} return;

            显然程序按顺序执行。

情况2:try{ return; }catch(){} finally{} return;

          程序执行try块中return之前(包括return语句中的表达式运算)代码;

         再执行finally块,最后执行try中return;

         finally块之后的语句return,因为程序在try中已经return所以不再执行。

情况3:try{ } catch(){return;} finally{} return;

         程序先执行try,如果遇到异常执行catch块,

         有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,

                     最后执行catch块中return. finally之后的代码不再执行。

         无异常:执行完try再finally再return.

情况4:try{ return; }catch(){} finally{return;}

          程序执行try块中return之前(包括return语句中的表达式运算)代码;

          再执行finally块,因为finally块中有return所以提前退出。

情况5:try{} catch(){return;}finally{return;}

          程序执行catch块中return之前(包括return语句中的表达式运算)代码;

          再执行finally块,因为finally块中有return所以提前退出。

情况6:try{ return;}catch(){return;} finally{return;}

          程序执行try块中return之前(包括return语句中的表达式运算)代码;

          有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;

                       则再执行finally块,因为finally块中有return所以提前退出。

          无异常:则再执行finally块,因为finally块中有return所以提前退出。

 

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。

                  如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,

                  编译器把finally中的return实现为一个warning。

 

下面是个测试程序

public class FinallyTest {

    public static void main(String[] args) {

        System.out.println(new FinallyTest().test());

    }

    static int test() {

        int x = 1;

        try { x++; return x; }

        finally { ++x; }

    }

}

结果是2。

分析:

在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。 在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果, 因此,即使finally中对变量x进行了改变,但是不会影响返回结果。 它应该使用栈保存返回值。


转:https://my.oschina.net/gAKey/blog/892772



推荐阅读
  • 死锁的概念“死锁”指的是:多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致两个或者多个线程都在等待对方释放资源 ... [详细]
  • 【java】关键字、代码块、接口、枚举学习笔记
    主要内容1关键字2代码块3接口4枚举1Java中的关键字1.1static关键字用一句话说就是:可以直接通过对象.的形式使用,不用new实 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • 深入理解Java类加载机制及安全防护
    本文探讨了Java类加载的过程,包括加载、验证、准备、解析和初始化五个阶段,并详细解释了每个阶段的具体操作和意义。此外,文章还讨论了Java如何通过双亲委派模型来保障核心API的安全性,以及在特定情况下如何打破这一机制。 ... [详细]
  • C++中类的内外定义及内联函数详解
    本文详细介绍了C++中的类内定义与类外定义,以及内联函数的使用方法和注意事项。通过实例说明了不同定义方式的优缺点,并探讨了编译器对内联函数的处理机制。 ... [详细]
  • AOP底层技术CGLIB示例 ... [详细]
  • JobScheduler5.0源码分析
    0.JobScheduler执行代码mJobScheduler(JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE); ... [详细]
  • 本文详细介绍了中心方形数的概念及其计算方法,并提供了多种编程语言下的实现代码。 ... [详细]
  • Hibernate入门指南:单表数据库操作详解
    本文介绍了Hibernate作为全面的ORM框架的基础知识,并详细讲解了在MyEclipse环境中配置Hibernate以及进行基本的数据库单表操作的方法,包括增删改查等常见操作。 ... [详细]
  • 本文档详细介绍了如何在Android应用中实现侧滑菜单(SlidingMenu)功能,包括设置侧边栏、全屏触摸模式以及初始化Fragment的具体步骤。 ... [详细]
  • Java 中的 LinkedTransferQueue isEmpty()方法 ... [详细]
  • 深入解析达内Java基础练习题
    本文精选了几道典型的Java基础题目,旨在帮助学习者巩固基础知识,提升编程技能。通过这些题目,你可以检验自己的Java基础掌握程度。 ... [详细]
  • 设计模式系列-原型模式
    一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
  • 【Java数据结构和算法】008栈
    目录0、警醒自己一、栈的应用场景和介绍1、栈的应用场景一个实际的场景:我的思考:2、栈的介绍入栈演示图:出栈演示图 ... [详细]
  • 本文提供了一个Android应用中用于抓取网页信息并下载图片的示例代码。通过该代码,开发者可以轻松实现从指定URL获取网页内容及其中的图片资源。 ... [详细]
author-avatar
TT0852_235
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有