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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程的状态

进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型 中&#xff0c;进程状态分为三个基本状态&#xff0c;即就绪态&#xff0c;运行态&#xff0c;阻塞态。在五态模型中&#xff0c;进程分为新建态、就绪态&#xff0c;运行态&#x…

【书生·浦语】大模型实战营——第四课笔记

教程链接&#xff1a;https://github.com/InternLM/tutorial/blob/main/xtuner/README.md 视频链接&#xff1a;https://www.bilibili.com/video/BV1yK4y1B75J/?vd_source5d94ee72ede352cb2dfc19e4694f7622 本次视频的内容分为以下四部分&#xff1a; 目录 微调简介 微调会使…

【ArcGIS遇上Python】ArcGIS Python批量筛选多个shp中指定字段值的图斑(以土地利用数据为例)

文章目录 一、案例分析二、提取效果二、代码运行效果三、Python代码四、数据及代码下载一、案例分析 以土地利用数据为例,提取多个shp数据中的旱地。 二、提取效果 原始土地利用数据: 属性表: 提取的旱地:(以图层名称+地类名称命名)

数据结构——排序算法之快速排序

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 前言&#xff1a; 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。 基本思想&…

弟12章 1 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165 网络协议概述 p164 ipv4&#xff1a;十进制点分制 ipv6&#xff1a;十六进制冒号分隔 TCP协议与UDP协议的区别 p165 tcp协议的三次握手&#xff1a;

MySQL单表查询

显示所有职工的基本信息。 mysql8.0 [chap03]>select * from worker; 查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 mysql8.0 [chap03]>select distinct(部门号) from worker; 求出所有职工的人数。 mysql8.0 [chap03]>select count(*) from …

山西电力市场日前价格预测【2024-01-14】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-14&#xff09;山西电力市场全天平均日前电价为415.13元/MWh。其中&#xff0c;最高日前电价为851.84元/MWh&#xff0c;预计出现在18:15。最低日前电价为198.87元/MWh&#xff0c;预计…

04.neuvector进程策略生成与管控实现

原文链接&#xff0c;欢迎大家关注我的github 一、进程学习管控的实现方式 策略学习实现&#xff1a; 进程的学习与告警主要依据通过netlink socket实时获取进程启动和退出的事件: 1.创建netLink socket&#xff1b; 2.通过创建netlink的fd对进程的事件进行捕获与更新&#x…

“超人练习法”系列08:ZPD 理论

01 先认识一个靓仔 看过 Lev Vygotsky 这个人的书吗&#xff1f;他是一位熟练心理学家&#xff0c;对人们习得技能的方式非常感兴趣&#xff0c;但他 37 岁的时候就因肺炎英年早逝了。 他认为社会环境对学习有关键性的作用&#xff0c;认为社会因素与个人因素的整合促成了学习…

计算机网络 —— 数据链路层

数据链路层 3.1 数据链路层概述 数据链路层把网络层交下来的数据构成帧发送到链路上&#xff0c;以及把收到的帧数据取出并上交给网络层。链路层属于计算机网络的底层。数据链路层使用的信道主要由以下两种类型&#xff1a; 点对点通信。广播通信。 数据链路和帧 链路&…

UniRepLKNet实战:使用 UniRepLKNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

LV.13 D10 Linux内核移植 学习笔记

一、Linux内核概述 1.1 内核与操作系统 内核 内核是一个操作系统的核心&#xff0c;提供了操作系统最基本的功能&#xff0c;是操作系统工作的基础&#xff0c;决定着整个系统的性能和稳定性 操作系统 操作系统是在内核的基础上添加了各种工具集、桌面管理器、库、…

基于Java SSM框架实现企业车辆管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现企业车辆管理系统演示 JSP技术 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了运动员的需求…

关于html导出word总结一

总结 测试结果不理想&#xff0c;html-to-docx 和 html-docx-js 最终导出的结果 都 差强人意&#xff0c;效果可以见末尾的附图 环境 "electron": "24.3.0" 依赖库 html-docx-js html-docx-js - npm html-to-docx html-to-docx - npm file-saver…

如何将重复方法封装为Aop切面并结合注解使用

首先要导入依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId> </dependency> 编写注解 package com.yg.domain.note;import java.lang.annotation.ElementType; import java.lang.annotation.Rete…

PyCharm连接服务器 - 2

文章目录 PyCharm连接服务器-21.如何连接服务器&#xff1f;2.如何在终端窗口打开SSH连接&#xff1f;3.Terminal终端出现中文乱码的解决办法&#xff1f;4.如何查看远程服务器的树目录结构&#xff1f;5.如何配置代码同步&#xff1f;6.如何为项目配置远程服务器中的python解释…

前端 TS 语法继承 多态 修饰符 readonly 抽象类 ts 基本写法 可选 剩余参数 函数重载 接口 类(3)

继承 继承之间的叫法 A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 子类 ---》派生类 基类 ---》超类&#xff08;父类&#xff09; // 继承之间的叫法 // A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 // 子类 ---》派生类 // 基类 …

【C++ 程序设计入门基础】- 第4节-函数

1、函数 函数是对实现某一功能的代码的模块化封装。 函数的定义&#xff1a; 标准函数&#xff1a; 输入 n 对整数的 a、b &#xff0c;输出它们的和。 #include <iostream> #include <windows.h> using namespace std;int add(int a,int b);//函数原型声明int…

ppt怎么录屏录音并且导出?好用录屏软件推荐

ppt已经成为了日常工作与学习中必不可少的工具&#xff0c;而ppt屏幕录制功能&#xff0c;可以方便用户将他人的演讲或视频中的内容记录下来&#xff0c;以便进一步学习与研究。录制ppt演示并将其导出为视频文件&#xff0c;可以帮助我们进行分享&#xff0c;但是很多人不知道p…

uniapp 制作 wgt 包(用于 app 的热更新)

升级版本号 修改 manifest.json 的配置&#xff0c;应用版本名称和应用版本号 必须高于上一版的值。 制作 wgt 包 发布 wgt 包 打开 uni-admin 项目的升级中心 上传后会自动生成下载链接 app 的静默热更新 发布新版后&#xff0c;用户打开app&#xff0c;后台会自动下载 wgt…