当try和finally都包含return时的执行顺序

两段代码演示:

public class Demo4 {
    public static void main(String[] args) {
        System.out.println(new Demo4().test());
    }
    int test(){
        int x=1;
        try {
            return x;
        } finally {
            ++x;
        }
    }
}

 这段代码执行后的结果是:1

 个人理解:当执行try中的语句时,返回值x现在存储的值是1,紧接着执行finally代码块++x,那么现在x的值是2

      那么问题来了:return x的值是否变为2了?答案是否定的,此时return x的值还是1;

      一旦return x的值确定,不管后面怎么操作,都不会影响。

public class Demo5 {
    public static void main(String[] args) {
        Demo5 d=new Demo5();

        System.out.println(d.get());
    }
    public int get() {
        try {
            return fun1();
        } finally {
            return fun2();
        }
    }
        int fun1(){
            System.out.println("fun1");
            return 1;
        }
        int fun2(){
            System.out.println("fun2");
            return 2;
    }
}

  这段代码执行的结果是:fun1  fun2   2

  个人理解:当main方法调用get方法时会调到try语句块,紧接着回跳到fun1方法中,此时回执行fun1的执行语句 然后返回1到 return fun1();

       try执行过后会执行finally代码块的语句,此时会跳到fun2方法中 执行fun2的输出语句 返回2到return fun2();

       那么最后的结果就是 fun1  fun2  2

结论:(1)  try  finally  return 执行顺序是  先执行try  语句块   然后执行 finally语句块   之后执行return

   (2)  当try和finally中都出现return是 (前提不出现异常的情况) 以finally的语句块return为最后的结果

   (3)  当return在try语句块中是 一旦确定了返回值  finally语句块不管怎么操作返回值,结果都是不变的。

      反之当return在finally语句块中 try语句块先对返回值进行操作,那么此时的返回值以操作过后的为准

原文地址:https://www.cnblogs.com/LittleBoys/p/12100262.html

时间: 2024-09-30 16:54:16

当try和finally都包含return时的执行顺序的相关文章

当try和finally里都有return时,会忽略try的return,而使用finally的return

今天去逛论坛 时发现了一个很有趣的问题: 谁能给我我解释一下这段程序的结果为什么是:2.而不是:3 代码如下: class Test { public int aaa() { int x = 1; try { return ++x; } catch (Exception e) { } finally { ++x; } return x; } public static void main(String[] args) { Test t = new Test(); int y = t.aaa();

域初始化、静态块及构造方法等在创建类实例时的执行顺序(转载)

在<Core java 2: volumn 1, Edition 5>一书的第四章“对象与类”中讲到域赋值语句.实例块.静态块及构造方法等在创建类实例时的执行顺序,中文译本有些处翻译的不贴切,而英文原书中也有一处错误.本文通过一个小程序来说明类实例构造过程中的语句执行顺序. 程序如下: public class Teststaticblock { public Teststaticblock() { this("second"); System.out.println(&q

Java类静态属性、静态块、非静态属性、非静态块、构造函数在初始化时的执行顺序

前言 今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过程中,静态域.静态块.非静态域.非静态块.构造函数的执行顺序问题.其实这是一个很经典的问题,非常考察对Java基础知识的掌握程度.很多面试过程中相信也有这样的问题,趁着周末有时间复习一下. 结论 这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的过程中,执行顺序如下: 实现自身的静态属性和静态代码块.(根据代码出现的顺序决定谁先执行) 实现自身的非静态属性和

高性能网站优化-确保异步加载脚本时保持执行顺序

<高性能网站建设进阶指南> 脚本如果按照常规方式加载,不仅会阻塞页面中其他内容的下载,还会阻塞脚本后面所有元素的渲染.异步加载脚本可以避免这种阻塞现象,从而提高页面加载速度.但是性能的提升是要付出代价的.代码的异步执行可能会出现竞争状态.简单地说就是页面内部的脚本需要的标示符如果是在外部文件中定义的,而当外部文件异步加载的时候,如果没有保证外部文件和内部脚本执行顺序,很有可能会出现未定义标示符的错误 当异步加载的外部脚本与行内脚本之间存在代码依赖时,就需要通过一种保证执行顺序的方法来整合这两个

Javascript在页面加载时的执行顺序【转】

一.在HTML中嵌入Javasript的方法 直接在Javascript代码放在标记对<script>和</script>之间 由<script />标记的src属性制定外部的js文件 放在事件处理程序中,比如:<p onclick="alert('我是由onclick事件执行的Javascript')">点击我</p> 作为URL的主体,这个URL使用特殊的Javascript:协议,比如:<a href="

Java子类继承父类,当实例化子类对象时的执行顺序

子类继承父类,当实例化子类对象时,执行顺序如下:     父类层级静态块      自身静态块     父类块      父类构造器     自身块      自身构造器 由于继承,肯定应该先加载父类再加载子类,加载类自然会调用静态块,然后是调用父类的构造函数和子类的构造函数,不过构造函数调用前肯定要先调用域或块,这样才能正确创建对象. ················································赋值顺序如下:     父类的静态变量赋值     自身的静态变

当C#中带有return的TryCatch代码遇到Finally时代码执行顺序

编写的代码最怕出现的情况是运行中有错误出现,但是无法定位错误代码位置.综合<C#4.0图解教程>,总结如下: TryCatchFinally用到的最多的是TryCatch,Catch可以把Try代码块的错误捕捉到,并对错误进行后续处理.这一点比较常见. 现在要讨论的是如果Try和Catch代码块有return时代码的执行顺序.众所周知,return的作用是退出当前函数,不执行return后面的代码.那么问题来了:如果return出现在Try或catch代码块中,并且return后面还有代码,则

还未打破的砂锅之——深究finally代码块与return语句的执行顺序!

问到finally代码块的执行顺序,就算刚刚学编程的新手都能好不犹豫的说出答案:不管异常与否,finally语句块的代码一定会被执行!虽然博主尚未完全搞懂其中奥妙,但是希望下面的代码能引起读者的深思,有人觉得明白与否没有太大意义,但我相信每个向上的人面对知识时都要有一颗近乎朝圣的心,因为我们是站在巨人或前人的肩膀上前进,因为我们还很渺小!其实明白与否很有意义,因为它涉及着你以后在finally代码块中的逻辑.话不多说,请看代码: public class finallyTest { public

Java_try,catch,finally return之间的执行顺序

以往认为函数只要执行到return语句便会返回结果并终止,然而这时错误的,因为这存在特例. 掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行. 2. 函数执行完try块中的return语句后不会终止,还会继续执行catch(仅在抛出异常时执行).finally语句块. 3.函数必须确保有唯一返回值 说明: try中如果包含return语句则catch块