文档章节

java中finally与return的测试方法

孟飞阳
 孟飞阳
发布于 2016/07/05 17:21
字数 470
阅读 23
收藏 1

直入正题,测试程序如下,看执行结果和你想的是否一致?

public class ReturnTest {
    public static void main(String[] args) {
        System.out.println("=============test1==================");
        System.out.println(test1());
        System.out.println("===============================");
        System.out.println("=============test1_1==================");
        System.out.println(test1_1());
        System.out.println("===============================");
        System.out.println("\n============test2===================");
        System.out.println(test2());
        System.out.println("===============================");
        System.out.println("\n============test2_1===================");
        System.out.println(test2_1());
        System.out.println("===============================");
        System.out.println("\n============test3===================");
        System.out.println(test3());
        System.out.println("===============================");
        System.out.println("\n============test3_1===================");
        System.out.println(test3_1());
        System.out.println("===============================");
    }

    public static String test1() {
        String a = "in try";
        try {
            return a;
        } catch (Exception e) {
        } finally {
            a = "in finally";
            System.out.println("do finally");
        }
        return a;
    }

    public static String test1_1() {
        String a = "in try";
        try {
            return a;
        } catch (Exception e) {
        } finally {
            a = "in finally";
            System.out.println("do finally");
            return a;
        }
    }

    public static int test2() {
        int a = 1;
        try {
            return a;
        } catch (Exception e) {
        } finally {
            a = 2;
            System.out.println("do finally");
        }
        return a;
    }

    public static int test2_1() {
        int a = 1;
        try {
            return a;
        } catch (Exception e) {
        } finally {
            a = 2;
            System.out.println("do finally");
            return a;
        }
    }

    public static Helper test3() {
        Helper a = new Helper();
        a.a = 1;
        try {
            return a;
        } catch (Exception e) {
        } finally {
            a.a = 2;
            System.out.println("do finally");
        }
        return a;
    }

    public static Helper test3_1() {
        Helper a = new Helper();
        a.a = 1;
        try {
            return a;
        } catch (Exception e) {
        } finally {
            a.a = 2;
            System.out.println("do finally");
            return a;
        }
    }

    static class Helper {
        int a;

        public String toString() {
            return String.valueOf(a);
        }
    }

}

结果如下:

=============test1==================
do finally
in try
===============================
=============test1_1==================
do finally
in finally
===============================

============test2===================
do finally
1
===============================

============test2_1===================
do finally
2
===============================

============test3===================
do finally
2
===============================

============test3_1===================
do finally
2
===============================

很好理解了。

#结论:

在try catch块里return的时候,finally也会被执行。

return 语句会把后面的值复制到一份用来返回,如果return的是基本类型的,finally里对变量的改动将不起效果,如果return 的是引用类型的,改动将可以起效果。

finally里的return语句会把try catch块里的return语句效果给覆盖掉。

看来return语句并不一定都是函数的出口,执行return时,只是把return后面的值复制了一份到返回值变量里去了。看来最佳实践是:

最好把return放到方法尾而不要在try cath 里return

不要在try catch块和finally块里都包含return

如果在try catch块里return, 则不要在finally块里操作被return的变量

© 著作权归作者所有

孟飞阳
粉丝 217
博文 1057
码字总数 566384
作品 5
朝阳
个人站长
私信 提问
JAVA final finally finalize区别

简单区别: 中等区别: 虽然这三个单词在Java中都存在,但是并没有太多关联: final:java中的关键字,修饰符。 1.如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被...

qq22734179
2014/03/21
61
0
异常处理——finally的特点、作用及面试题

finally的特点: (1) 是异常处理的一部分,用于释放资源; (2) 一般来说,被finally控制的代码一定会执行; (3) 特殊情况:如果在执行到finally之前jvm退出了(比如:System.exit(0),但是,...

G_66_hero
2018/09/12
0
0
Java finally语句与return语句执行顺序解析

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会...

passionfly
2015/04/18
436
0
SpringBoot基础篇AOP之高级使用技能

更多相关内容,查看: http://spring.hhui.top/ 前面一篇博文 190301-SpringBoot基础篇AOP之基本使用姿势小结 介绍了aop的简单使用方式,在文章最后,抛出了几个问题待解决,本篇博文则将针对...

小灰灰Blog
03/10
41
0
关于 Java 中 finally 语句块的深度辨析

文章来自 IBM developerWorks 可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机。接下来我就带您一步一步的揭开这个 finally 的神秘面纱。 问题分析 首先来问大家一个...

IBMdW
2011/07/15
306
4

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(四)——复合Lambda

在一起来学Java8(二)——Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda。 Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用Lambda表达式实现函...

猿敲月下码
31分钟前
9
0
debian10使用putty配置交换机console口

前言:Linux的推广普及,需要配合解决实际应用方能有成效! 最近强迫自己用linux进行实际工作,过程很痛苦,还好通过网络一一解决,感谢各位无私网友博客的帮助! 系统:debian10 桌面:xfc...

W_Lu
今天
10
0
aelf Enterprise 0.8.0 beta有奖公测,“Bug奖金计划”重磅开启

2019年9月30日,aelf Enterprise 0.8.0 beta版正式发布。aelf Enterprise 0.8.0 beta是一个完备的区块链系统, 包含完备的区块链系统、开发套件、开发文档、以及配套的基础应用和基础服务。 ...

AELF开发者社区
今天
10
0
oracle 初始化数据库脚本

create user lpf identified by 123456; create tablespace lpf_ts_cms datafile '/opt/app/oracle/product/11.2.0/lpf.dbf' size 200M; alter user lpf default tablespace lpf_ts_cms; sel......

internetafei
今天
8
0
深入了解Redis底层数据结构

说明 说到Redis的数据结构,我们大概会很快想到Redis的5种常见数据结构:字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted Set),以及他们的特点和运用场景。不过它们是...

TurboSanil
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部