Java中finally和return的执行顺序

17 篇文章 2 订阅
订阅专栏

try…catch…finally

try-catch-finally是一种针对程序运行时出错的响应手段,对于一些可以预料到的出错类型,在发生时对其进行报告和补救。其使用流程如下:首先执行try中的语句,如果try中的语句报错了,那么就转入对应的catch语句中执行处理异常的措施,catch后的语句中的内容是对应的错误类型。无论异常是否发生,finally中的内容一定是会被执行的,一般用来释放资源,并确保某些操作一定会执行。当try和catch中有return时,finally中代码仍然会执行。

其使用的格式如下:

try {

} catch (IOException e) {
	
} finally { // 关闭资源
    res.close();
}

1. finally语句在return语句执行之后return返回之前执行的

public class TestTryFinally {
    
    public static void main(String[] args) {
        System.out.println(test01());
    }

    private static int test01() {
        int num = 0;

        try {
            System.out.println("try block");
            num = 10;
            return num;            
        } catch (Exception e) {
            System.out.println("catch block");
        } finally {
            System.out.println("finally block");
            num = 30;
        }

        return num;
    }
}

输出结果:
try block
finally block
10

说明return语句已经执行了再去执行finally语句,不过并没有直接返回,而是等finally语句执行完了再返回结果。

public class TestTryFinally {
    
    public static void main(String[] args) {
        System.out.println(test02());
    }

    private static String test02() {

        try {
            System.out.println("try block");
            return test03();
        } catch (Exception e) {
            System.out.println("catch block");
        } finally {
            System.out.println("finally block");
        }

        return "";
    }

    private static String test03() {
        System.out.println("invoke method: test03()");

        return "method test03() return";
    }

}

输出结果:
try block
invoke method: test03()
finally block
method test03() return

说明try中的return语句先执行了但并没有立即返回,等到finally执行结束后再返回。

2. finally块中的return语句会覆盖try块中的return返回


public class TestTryFinally {
    
    public static void main(String[] args) {
        System.out.println(test04());
    }

    /*
     * finally块中的return语句会覆盖try块中的return返回
     */
    private static String test04() {
        String s = "init";

        try {
            System.out.println("try block");
            
            return "try";            
        } catch (Exception e) {
            System.out.println("catch block");
        } finally {
            System.out.println("finally block");
            return "finally";
        }

        // return s;
    }
}

输出结果:
try block
finally block
finally

这说明finally里的return直接返回了,就不管try中是否还有返回语句,这里还有个小细节需要注意,finally里加上return过后,finally外面的return s就变成不可到达语句了,也就是永远不能被执行到,所以需要注释掉否则编译器报错。

3. 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。

import java.util.*;

public class TestTryFinally {
    public static void main(String[] args) {
    	System.out.println(test01());
        System.out.println("######################");
        System.out.println(getMap().get("key").toString());
    }
    
    private static int test01() {
        int num = 0;

        try {
            System.out.println("try block");
            num = 10;
            return num;            
        } catch (Exception e) {
            System.out.println("catch block");
        } finally {
            System.out.println("finally block");
            num = 30;
        }

        return num;
    }
    
    public static Map<String, String> getMap() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("KEY", "INIT");
         
        try {
            map.put("KEY", "TRY");
            return map;
        } catch (Exception e) {
            map.put("KEY", "CATCH");
        } finally {
            map.put("KEY", "FINALLY");
            map = null;
        }
         
        return map;
    }
}

我们先来看一下AI(ChatGPT3.5,Bard和文心一言3.5)给出的答案是什么。我们可以看到ChatGPT文心一言给出的结果是:程序会抛出NullPointerException异常,而Bard给出的结果为:TRY
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
而实际运行代码,我们得到的结果为:FINALLY

输出结果:
try block
finally block
10
######################
try block
finally block
finally

为什么test01()finally里的num = 30;并没有起到作用,而getMap()finallymap.put("key", "finally");起了作用,而map = null;却没起作用呢?这就是Java到底是传值还是传址的问题了,简单来说就是:Java中只有传值没有传址,这也是为什么map = null这句不起作用。

4. try块里的return语句在异常的情况下不会被执行

    public static void main(String[] args) {
        System.out.println(test06());
    }

    private static int test05() {
        int num = 10;

        try {
            System.out.println("try block");
            num = 5 / 0;

            return num;
        } catch (Exception e) {
            System.out.println("catch block");
            num += 20;
        } finally {
            System.out.println("finally block");

            num += 30;
        }

        return num;
    }

输出结果:
try block
catch block
finally block
60

try语句块中发生了除0异常,所以try中的return不会被执行到,而是接着执行捕获异常的catch语句和最终的finally语句,此时两者对num的修改都影响了最终的返回值。

5. 当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样

    public static void main(String[] args) {
        System.out.println(test06());
    }

    private static int test06() {
        int num = 10;

        try {
            System.out.println("try block");
            num = 5 / 0;

            return num;
        } catch (Exception e) {
            System.out.println("catch block");
            num += 20;
            return num;
        } finally {
            System.out.println("finally block");

            num += 30;
        }

        // return num;
    }

输出结果:
try block
catch block
finally block
30

说明了发生异常后,catch中的return语句先执行,确定了返回值后再去执行finally块,执行完了catch再返回,finally里对num的改变对返回值无影响,原因同前面一样,也就是说情况与try中的return语句执行完全一样。

finallyreturn执行顺序
weixin_40452750的博客
11-29 510
javafinallyreturn执行顺序
java finallyreturn
91奔跑的蜗牛
09-13 765
finally 子句包含 return 语句时,将会出现一种意想不到的结果 , 假设利用 return语句从 try 语句块退出。 在方法返回前 ,finally子句的内容将被执行。 如果 finally 子句也有一个 return 语句 , 这个返回值将会覆盖原始的返回值。 public static void main(String[] args) { int nun =...
Java finallyreturn执行顺序回顾
2401_85112052的博客
06-25 615
在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java高级面试没一点难度。本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)
先给接口返回信息后执行其他代码 Java
最新发布
weixin_41440148的博客
08-20 105
我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/f2PFnN实现“先给接口返回信息后执行其他代码”的方法 在Java开发过程,尤其是在处理web接口时,有时我们需要在响应客户端请求后再去执行某些其他操作。这样的需求通常可以用异步编程的方式来实现...
finallyreturn执行顺序
龚小帅的博客
07-12 1472
代码一: 运行结果如下: 从上述运行结果来看,在执行到之前先运行了代码,为什么会是这样的呢?我们可以看看编译后的代码如下: 发现编译后 被优化了放到了后面,间都是用临时变量存储的,所以自然而然执行顺序就是先输出然后执行。同时也是表示这个方法运行完准备退出。 代码二: 运行结果如下: 为什么是这样的输出结果,我们查看编译后的代码如下所示: 还是因为代码自动优化了。代码三: 运行结果如下所示: 看完运行结果我们看看编译后的代码如下所示: 从这里可以看出只要在加了代码结束符,其他地方的都忽略,在加就相当于
javafinallyreturn执行顺序详解
qj19842011的专栏
05-12 1万+
一些准备知识:     首先为了说明白javafinallyreturn执行顺序是怎样的这个问题,我们需要做一点准备工作。     java方法是在栈幀执行,栈幀是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间,栈幀分为三个区域:     1. 操作数栈,用来保存正在执行的表达式的操作数,数据结构学习过基于栈的多项式求值算法,操作数栈的
Javafinallyreturn执行顺序
热门推荐
大灰狼的专栏
05-11 1万+
总结: 1 finally语句在return语句执行之后return返回之前执行的 2 finallyreturn语句会覆盖tryreturn返回 3 如果finally语句没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变 4 try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况 5 当发生异常后,catchreturn执行情况与未发生异常tryreturn的执行情况完全
Java finallyreturn执行顺序
weixin_44730681的博客
02-16 681
前言 在 Java异常处理trycatchfinally 是按顺序执行的。 如果 try 没有异常,则顺序为 tryfinally; 如果 try 异常,则顺序为 trycatchfinally。 但是,当 trycatchfinally 都加入 return 之后,returnfinally执行顺序是咋样的? 注:finally 代码块是一定会被执行的。 我总结为以下几条: 执行 try 代码块或 catch 代码块return 语句之前,都会先执行
finallyreturn执行顺序
玩垃圾的人
06-03 3624
finally异常代码块,最后都会执行的代码。通常用来关闭资源。 return:用于跳出当前方法,指针返回值。 这篇文章主要是为了验证,当我们的异常代码块,在finally代码前就已经return。那么会任何执行呢?我列出以下几个场景来验证。 1.try...catchreturnfinally里面的语句会执行吗? 如下是tryreturn的执行情况。 public c...
Javafinally执行顺序_Java returnfinally执行顺序
weixin_39733805的博客
02-25 175
Java语法return表示当前执行的结束,finally则是在当前代码块一定会执行的代码块。如果returnfinally在之前执行,finally也会执行吗?答案是肯定的!但是,finallyreturn执行顺序则并不是真正意义上的先后顺序。1 public String test(){2 String s = "";3 try {4 s = "try";5...
finallyreturn执行顺序、结果
shuang5725的博客
03-28 386
1. trycatchreturn时,finally里面的语句会被执行吗 我们可以来分别看看 (1)执行tryreturn时 public class tryDemo { public static int show() { try { return 1; }finally{ System.out.println(“finally模块被执行”); } } public static v...
javafinallyreturn执行顺序
weixin_34216107的博客
04-28 125
注意:return的位置。。。 从这几个例子可以看到,如果try之前没有有条件的return,则try..catch..finally语句块的语句都是顺序执行(如果try或者catchreturn语句,那么先执行该return,然后执行finally, 如果finally也有return, 该出的返回值会覆盖掉trycatch的r...
Javafinallyreturn执行顺序
骏马逸动,心随你动的博客
03-24 8272
Java异常处理trycatchfinally 是按顺序执行的。如果 try 没有异常,则顺序为 tryfinally,如果 try 异常,则顺序为 trycatchfinally。但是当 trycatchfinally 加入 return 之后,returnfinally执行顺序让很多人混淆不清。下面来分别说明一下。 1. trycatch 带有return 1)try 带有 return public class tryDemo { ...
returnfinally执行顺序
来日可期a的博客
09-02 398
return执行时,先会将后面的表达是的值,置于返回栈的顶部(此为方法的最终返回值),然后去执行finally的代码 return的最后返回值取决于return后面的表达式的值 此处共涉及三个操作:序号1是return最终的返回操作、序号2是return后面的表达式、序号3是finally的执行,其执行顺序为:序号2>序号1>序号3 示例 public class Test01 {...
finallyreturn执行的先后顺序
youngbird1998的博客
05-14 431
最近学了一个trycatchfinally语句块,这里面有个小问题困扰了我一段时间,如在try语段定义了一个变量并且return它,在finally里修改return定义的变量,那么最终是先执行return还是finally呢?下面是这次题目 public static void main(String[] args) { int test = test(3,5); System.out.println(test); } public static int test(int x, int
returnfinally执行顺序 ?各位大佬请看过来,
White_i的博客
10-08 2165
思考题1 : returnfinally执行顺序 ? 答: return 先执行 将方法停下,后执行finally ,最后 在执行 return将值返回 例如: public class Return_Finally { public static void main(String[] args) { System.out.println(A.a()); } } class A { public static int a() { int i = 1; try{ re
finally到底是在return之前执行还是return之后执行?
baidu_20608025的博客
02-13 5694
https://blog.csdn.net/csdn_bang/article/details/86662998   1、finally是在return语句执行之后,return语句返回之前,finally是必执行的(当然是建立在try执行的基础上); 2、finally修饰的基本类型没有return是不影响返回结果的,有了return才会影响返回结果; 3、finally修改set、...
try-catch-finally-return执行顺序
11-22
try-catch-finally-return执行顺序如下: 1.程序先执行try的代码。 2.如果try的代码出现异常,则跳转到catch执行相应的代码。 3.如果catchreturn语句,则执行return之前(包括return语句的表达式运算)的代码,然后执行finally的全部代码,最后执行catchreturn语句。 4.如果try的代码没有出现异常,则执行finally的全部代码,最后执行tryreturn语句。 5.如果finallyreturn语句,则直接执行finallyreturn语句,不再执行tryreturn语句。 以下是两个try-catch-finally-return执行顺序的例子: 1.情况3: ```java try { //执行try的代码 } catch (Exception e) { //执行catch的代码 return; //执行catchreturn语句之前的代码 } finally { //执行finally的全部代码 } return; //执行catchreturn语句 ``` 2.情况2: ```java try { return; //执行tryreturn语句 } catch (Exception e) { //执行catch的代码 } finally { //执行finally的全部代码 } return; //执行tryreturn语句 ```
写文章

热门文章

  • 在线词云工具生成词云图——Wordart的使用 133689
  • Android EditText设置边框 37457
  • Android 圆角按钮的实现 35713
  • Android 平台上方便实用的 Shell 终端模拟工具 32757
  • Android空引用问题的解决方法——on a null object reference 29366

分类专栏

  • Android 73篇
  • AI
  • JNI 3篇
  • Algorithm 1篇
  • Java 17篇
  • 机器学习 5篇
  • 工具类 4篇
  • python 3篇
  • 框架 3篇
  • 文件选择 2篇

最新评论

  • Java中finally和return的执行顺序

    权侵天下: 他代码写的有问题 main方法获取的是小写的key,下面塞值塞的是大写的KEY,main方法改成大写的KEY就是FINALLY

  • Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time

    rimuweinuan_: clean下就好了。不好意思,不打扰了

  • Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time

    rimuweinuan_: 你确认方式二有用吗?

  • Android源码——Handler机制(一)

    CSDN-Ada助手: 推荐 Java 技能树:https://edu.csdn.net/skill/java?utm_source=AI_act_java

  • Android——图表库MPAndroidChart的使用

    2301_78114243: 这个库不支持X轴坐标是负数,负数就报错

大家在看

  • 免费SSL证书申请的平台
  • FPGA小白初学第一天 210
  • locate命令 497
  • DDD话语批评之一:评“状态和事件本质相同”[全文] 590
  • whereis命令 240

最新文章

  • Android源码——Handler机制(一)
  • Android 实现竖排文本(垂直方向显示)
  • Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time
2024年6篇
2023年12篇
2022年11篇
2021年15篇
2020年12篇
2019年10篇
2018年7篇
2017年31篇
2016年2篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家河北欧式玻璃钢雕塑供应商锦州玻璃钢主题雕塑江苏玻璃钢字母座椅雕塑玻璃钢园林雕塑制作邢台玻璃钢仿铜雕塑价格陕西玻璃钢雕塑定制厂家浙江玻璃钢雕塑摆件怎么样玻璃钢仿铜雕塑品牌台州玻璃钢陶瓷雕塑制作东莞玻璃钢孔雀雕塑户外玻璃钢雕塑设计江苏商场大型美陈玻璃钢文字音符雕塑厂家直销新化玻璃钢卡通雕塑长葛商场美陈植物墙南昌定制玻璃钢雕塑市场浙江动物玻璃钢雕塑定做价格肇庆玻璃钢动物雕塑推荐厂家玻璃钢骆驼雕塑哪家强玻璃钢卡通雕塑有多好玻璃钢雕塑质量上乘湖南花朵玻璃钢景观雕塑厂家沧州玻璃钢雕塑设计北京玻璃钢雕塑制造厂家玻璃钢雕塑上色用什么白银玻璃钢雕塑销售蚌埠玻璃钢雕塑公司公园商场美陈装饰系列北流玻璃钢泡沫雕塑玻璃钢雕塑骑行人物香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化