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;
        }
    }

  • 相关阅读:
    Effective Java 19 Use interfaces only to define types
    Effective Java 18 Prefer interfaces to abstract classes
    Effective Java 17 Design and document for inheritance or else prohibit it
    Effective Java 16 Favor composition over inheritance
    Effective Java 15 Minimize mutability
    Effective Java 14 In public classes, use accessor methods, not public fields
    Effective Java 13 Minimize the accessibility of classes and members
    Effective Java 12 Consider implementing Comparable
    sencha touch SortableList 的使用
    sencha touch dataview 中添加 button 等复杂布局并添加监听事件
  • 原文地址:https://www.cnblogs.com/jalenFish/p/14099042.html
Copyright © 2011-2022 走看看