zoukankan      html  css  js  c++  java
  • (附运行结果和截图)关于try{return}finally中都有return 运行结果测试之旅

    关于try{return}finally{return},这类的问题,面试中很常见,而且有时候现实码代码中也会碰到,所以乘着今天不是很忙的情况下,我无意中想起了自己还不是非常清楚的try...return和finally...return,看了无数遍理论知识不如自己测试来的实在,

    首先复习已有的知识知道:
    return 是可以当作终止语句来用的,我们经常用它来跳出当前方法,并返回一个值给调用方法。然后该方法就结束了,不会执行return下面的语句。
    finally :无论try语句发生了什么,无论抛出异常还是正常执行。finally语句都会执行。

    然后测试效果如下。

    初级版测试


    首先呢,这两个地方必须得有一个return,否则编译都通不过,如果有人给你的是上面截图这种的,你可以很自信的告诉他,对不起,你的代码编译都通不过。

    1、在finally中放return

    猜想:这种情况很简单,因为finally语句块里有了return,那么一定返回的是finally中的str,所以运行结果应该是ccc

    运行结果:


    所以猜想正确。

    2、在finally外面放return

    猜想:难道这种放的和第一种放的会不一样吗?所以大胆猜想,结果应该还是ccc。

    运行结果:


    运行结果居然是bbb,是不是很吃惊,what?居然和猜想不一样?当然这时候小编决定debug,看看它是怎么走的,最终发现,当运行到finally里面的str="ccc"的时候,并没有走finally下面的这个return,而是直接到main方法里的

    String ff = Test002.ff();

    这里了,说明这里执行的是try语句块里的return了,所以这是为什么呢?

    赶紧翻看各种文档,网上查资料,

    最终你会看到jvm官方文档里有关于try catch finally的说明


    不知道大家的英语怎么样,能不能翻译一下

    通过有道、百度翻译,大概内容是这样的

    如果try语句里有return,那么代码的行为如下:
    1.如果有返回值,就把返回值保存到局部变量中
    2.执行jsr指令跳到finally语句里执行
    3.执行完finally语句后,返回之前保存在局部变量表里的值

    所以看到这里,大家应该差不多清楚了吧。


    3、去掉try语句块里的return

    上面第2种说到是没有走finally下面的这个return 的,如果把try语句块里的return去掉,这时候不管下面的这个return是放在finally里面还是外面,这时候相当于程序运行从上到下,遇到return截止,所以运行结果最终是“ccc”


    以上的测试代码,小编放在这里,想要测试的小伙伴们,可以直接测试

    public class Test002 {
        public static void main(String[] args) {
            String ff = Test002.ff();
            System.out.println(ff);
        }
        public static String ff(){
            String str = "aaa";
            try {
                 str = "bbb";
                 return str; 
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                str = "ccc";
                //return str;
            }
            return  str;
        }
    }


    高级版测试

    下面小编就不一一介绍了,相信大家都已经明白了,只不过是将字符串变成++i 这种形式



    这两种情况和上面的初级版测试字符串的是一样的,所以上面清楚了,这个应该也清楚了


    但是当变成 i++的形式之后,你就会发现......




    代码放这里了,想测试的小伙伴们,可以拿去测试哦

    public class Test002 {
        public static void main(String[] args) {
            int ff = Test002.ff();
            System.out.println(ff);
        }
        public static int ff(){
            int str = 1;
            try {
                 str = str++;
                 return str;
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                str = str++;
                //return str;
            }
            return  str;
        }
    }

  • 相关阅读:
    mysql自定义函数多表更新:update_order_relation()
    mysql自定义函数初始化数据:init_data()
    关于tomcat启动错误:At least one JAR was scanned for TLDs yet contained no TLDs
    intellij debug模式提示 Method breakpoints may dramatically slow down debugging
    Linux开机启动流程详细步骤是什么?
    chkconfig 添加脚本开机自启动
    优化SSH配置(一键完成增加若干参数)
    linux目录整理
    linux命令整理
    buffer和cache有什么区别?
  • 原文地址:https://www.cnblogs.com/jalenFish/p/14099042.html
Copyright © 2011-2022 走看看