当前位置: 首页 > news >正文

Java中 return 和finally

1. 最简单的情形

    public void main(){
        String s = test();
        System.out.println("s=[" + s + "]");
    }
    
    public String test(){
        String s = "";
        try{
            System.out.println("In try");
            s += "try," ;
        }catch(Exception ex){
            System.out.println("In catch");
        }finally{
            s += "finally,";
            System.out.println("In finally");
        }
        s+="other";
        return s;
    }

输出的结果是:

In try
In finally
s=[try,finally,other]

2. 在try中加上return,那么结果是

    public String test(){
        String s = "";
        try{
            System.out.println("In try");
            s += "try," ;
            return s; //加上return
        }catch(Exception ex){
            System.out.println("In catch");
        }finally{
            s += "finally,";
            System.out.println("In finally");
        }
        s+="other";
        return s;
    }

结果是

In try
In finally
s=[try,]

说明虽然会执行finally语句,但是return的结果已经准备好了。然后才执行finally,在执行finally之前,会将返回的结果存储到不同于s的变量中,finally执行成功之后,才会返回对应的结果。因此即使在finally中对结果进行修改,也不会修改返回的结果。

3. 如果在catch中return会怎么样呢?

    public String test(){
        String s = "";
        try{
            System.out.println("In try");
            s += "try," ;
            throwException();
        }catch(NullPointerException ex){
            System.out.println("In catch");
            s += "catch,";
            return s;
        }finally{
            s += "finally,";
            System.out.println("In finally");
        }
        s+="other";
        return s;
    }
    
    public void throwException() throws NullPointerException{
        throw new NullPointerException();
    }

执行结果是:

In try
In catch
In finally
s=[try,catch,]

可见道理是一样的,也就是不管在try还是在catch中的语句中return的结果,即使在finally中进行修改,都不会改变结果。

4. return 语句先执行,还是finally先执行呢?

    public String test(){
        String s = "";
        try{
            
            System.out.println("In try");
            s += "try," ;
            throwException();
        }catch(NullPointerException ex){
            System.out.println("In catch");
            s += "catch,";
            return s += testReturn();
        }finally{
            s += "finally,";
            System.out.println("In finally");
        }
        s+="other";
        return s;
    }
    
    public String testReturn(){
        System.out.println("In Return");
        return "return,";
    }
    
    public void throwException() throws NullPointerException{
        throw new NullPointerException();
    }

结果是:

In try
In catch
In Return
In finally
s=[try,catch,return,]

也就是,return还是要比finally先执行,但是这时函数还没急着返回,只有把finally执行完才会返回。

 

总结的结果是: 

1. 不管是否有异常,finally都会执行

2. 即使try或catch中有return语句,finally仍然会执行

3. finally中语句是在return语句之前执行的,即return语句执行就决定了返回的结果

4. return语句执行完如果还有finally块,还会执行finally块,但是无法修改return语句返回的结果

 

参考资料:

http://www.cnblogs.com/ybwang/archive/2010/10/10/1847269.html

转载于:https://www.cnblogs.com/longshaohang/p/3748076.html

相关文章:

  • IT架构师绝对不能错过的34张史上最全技术知识图谱
  • 磁盘管理命令
  • 华信Sybase ASE数据库恢复软件 3.0
  • 复杂网络的统计描述
  • 复兴号动车组甲醛超标?中国铁路北京局:报道不实
  • YUM+NTP服务器的搭建 (RHEL6.1搭建) 纯文本
  • 组复制官方翻译四、Monitoring Group Replication
  • 在这里,你终究会真正地失败
  • JavaScript Array 的方法 (笔记)
  • python的抽象编程思想
  • YY的GCD
  • 哈希 --- 线性探测法
  • 百度的疯狂 UC的隐忍
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 新的一年,来看看大数据与AI的未来展望
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【mysql】环境安装、服务启动、密码设置
  • 2017-08-04 前端日报
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • jquery cookie
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Mybatis初体验
  • Nacos系列:Nacos的Java SDK使用
  • nginx 负载服务器优化
  • orm2 中文文档 3.1 模型属性
  • Vue.js源码(2):初探List Rendering
  • 爱情 北京女病人
  • 当SetTimeout遇到了字符串
  • 订阅Forge Viewer所有的事件
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 前嗅ForeSpider采集配置界面介绍
  • 浅谈Golang中select的用法
  • 算法系列——算法入门之递归分而治之思想的实现
  • 我的zsh配置, 2019最新方案
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 最近的计划
  • MyCAT水平分库
  • %@ page import=%的用法
  • (pojstep1.3.1)1017(构造法模拟)
  • (二)Linux——Linux常用指令
  • (二开)Flink 修改源码拓展 SQL 语法
  • (转)LINQ之路
  • (转)可以带来幸福的一本书
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET 表达式计算:Expression Evaluator
  • .NET 中创建支持集合初始化器的类型
  • @EnableConfigurationProperties注解使用
  • [2021 蓝帽杯] One Pointer PHP
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [BZOJ1053][HAOI2007]反素数ant
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C++] new和delete
  • [C++基础]-初识模板