Java中finally和return的执行顺序

Java中finally和return的执行顺序

    • try...catch...finally
    • 1. finally语句在return语句执行之后return返回之前执行的
    • 2. finally块中的return语句会覆盖try块中的return返回
    • 3. 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。
    • 4. try块里的return语句在异常的情况下不会被执行
    • 5. 当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样

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语句执行完全一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341364.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习_7、KNN

数据采用&#xff1a;电离层数据 KNN完整的代码电离层数据资源-CSDN文库 代码 import os import csv import numpy as np from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import …

CMake入门教程【高级篇】查找文件、目录、库find_file、find_path、find_library

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.概述2.详细命令作用3.使用说明4.完整代码示例5.总结与分析1.概述 在复杂的 CMake 项目中,经常需要查找文件、目录或库。CMake 提供了 find_file,find_pat

【谭浩强C程序设计精讲 7】数据的输入输出

文章目录 3.5 数据的输入输出3.5.1 输入输出举例3.5.2 有关数据输入输出的概念3.5.3 用 printf 函数输出数据1. printf 的一般格式2. 格式字符 3.5.4 用 scanf 函数输入数据1. scanf 函数的一般形式2. scanf 函数中的格式声明3. 使用 scanf 函数时应注意的问题 3.5.5 字符输入输…

2024年 最新 iPhone手机 历代机型、屏幕尺寸、纵横比、分辨率 整理

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…

华为端口安全常用3种方法配置案例

安全动态mac地址学习功能 [Huawei]int g0/0/01 interface GigabitEthernet0/0/1 port-security enable //开启安全 port-security max-mac-num 2 //最多为2个mac地址学习 port-security protect-action restrict //丢包带警告 port-security aging-time 1 //mac地址的老化时间…

Java电影购票小程序在线选座订票电影

Java电影购票小程序 功能&#xff1a;注册用户可已查看电影场次评价选座订票退票&#xff0c;影院管理员可以排片退款在线卖票和管理演播室等。超级管理员可管理电影排片电影院用户管理等。 演示视频 小程序&#xff1a; https://www.bilibili.com/video/BV11W4y1A7mK/?shar…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑤

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应处理&#xff0c;执行j10*x-y返回文字“j1&#xff1a;”和计算值&#xff0c;执行j(x-y)*(10⁵%7)返回文字“j2&#xff1a;”和计算值&#xff0c;执行jy*log(x10)返回文字“j3&#xff1a;”和计算值…

【ChatGPT-Share,国内可用】GPTS商店大更新:一探前沿科技的魅力!

使用地址&#xff1a;https://hello.zhangsan.cloud/list GPTS商店预览,王炸更新 精选应用&#xff1a; 系统内置应用&#xff1a; 绘画应用&#xff1a; 写作应用&#xff1a; 高效工具应用&#xff1a; 学术搜索和分析应用&#xff1a; 编程应用&#xff1a; 教育应…

第九届远程教育与学习国际会议(ICDEL 2024)即将召开!

2024年第九届远程教育与学习国际会议&#xff08;ICDEL 2024&#xff09;将于2024年6月14-17日在中国广州召开&#xff0c;由华南师范大学主办。在信息通信技术和学习科学发展的影响下&#xff0c;远程教育的进一步发展和传播&#xff0c;使之逐渐成为当前教育领域的重要组成部…

2023 Gartner® 云数据库管理系统魔力象限发布 PingCAP 入选“荣誉提及”

近日&#xff0c;全球 IT 市场研究和咨询 公司 Gartner 发布最新报告《Magic Quadrant™ for Cloud Database Management Systems》&#xff08;云数据库管理系统魔力象限&#xff09;&#xff0c; 企业级开源分布式数据库厂商 PingCAP 入选“荣誉提及” 。前不久&#xff0c;P…

「Qt Widget中文示例指南」如何实现一个日历?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文中的CalendarWi…

QWebEngineView类方法、属性、信号与槽汇总

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒📝 使用示例📝 方法📝 属性📝 信号(Signals)📝 槽(Slots)⚓️ 相关链接 ⚓️📖 介绍 📖 QWebEngineView 是 Qt 提供的一个用于呈现 Web 内容的类,基于 Google 的 Chromium 浏览器引擎。它提供了对现…