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

Java学习第一百三十六部分——finally块执行时机

目录

一、前言简介

二、finally 块执行时机

三、finally 块在 `return` 之前执行示例

四、finally 块可以改变返回值吗?

五、finally 块的用途

六、总结归纳


一、前言简介

       在 Java 中,`finally` 块是一个特殊的代码块,它通常与 `try` 和 `catch` 块一起使用,用于确保某些代码无论是否发生异常都会被执行。`finally` 块的执行时机非常关键,尤其是在涉及到 `return` 语句时。

二、finally 块执行时机

  • 正常执行:当 `try` 块或 `catch` 块正常执行完毕后,`finally` 块会执行。

  • 异常发生:当 `try` 块中发生异常且没有被 `catch` 块捕获时,`finally` 块仍然会执行。

  • return 语句:即使在 `try` 块或 `catch` 块中遇到 `return` 语句,`finally` 块也会在 `return` 之前执行。

  • `break`、`continue` 或 `throw` 语句:如果在 `try` 块或 `catch` 块中遇到 `break`、`continue` 或 `throw` 语句,`finally` 块也会在这些语句执行之前执行。

三、finally 块在 `return` 之前执行示例

public static int test() {try {return 1;} finally {System.out.println("finally"); // 先执行此行,再return}
}

执行流程:
  1. `try` 块中的 `return 1;` 被执行。
  2. 在 `return` 语句执行之前,`finally` 块会被调用。
  3. `finally` 块中的 `System.out.println("finally");` 会被执行。
  4. 最后,`return 1;` 的值被返回。

四、finally 块可以改变返回值吗?

疑惑解释

在 Java 中,`finally` 块不能直接改变 `return` 的值,但可以通过以下方式影响返回值:

  • 修改变量:如果 `return` 语句返回的是一个变量的值,而这个变量在 `finally` 块中被修改,那么返回值可能会被改变。

  • 抛出异常:如果在 `finally` 块中抛出异常,那么原本的 `return` 语句会被中断,异常会被抛出。

示例 1:修改变量

public static int test() {int result = 1;try {return result;} finally {result = 2; // 修改变量}
}

输出:返回值仍然是 `1`,因为 `return` 语句已经确定了返回值,`finally` 块中的修改不会影响已经确定的返回值。

示例 2:抛出异常

public static int test() {try {return 1;} finally {throw new RuntimeException("Exception in finally");}
}

输出:`RuntimeException` 被抛出,`return 1;` 的值不会被返回。

五、finally 块的用途

  • 资源清理:关闭文件流、数据库连接等资源。

  • 日志记录:记录方法的执行情况。

  • 状态恢复:恢复某些状态,确保程序的稳定性。

六、总结归纳

  • `finally` 块会在 `try` 或 `catch` 块执行完毕后(无论是否发生异常)执行。

  • `finally` 块会在 `return` 语句之前执行,但不能直接改变 `return` 的值。

  • `finally` 块可以抛出异常,从而中断 `return` 的执行。

http://www.dtcms.com/a/333170.html

相关文章:

  • 如何回答研究过MQ的源码吗
  • Jenkins 环境部署
  • 在多语言大模型中保留文化细微差别:超越翻译
  • IPv4地址和IPv6地址:解析两代互联网协议的本质差异
  • 【swift开发】SwiftUI概述 SwiftUI 全面解析:苹果生态的声明式 UI 革命
  • DevEco Studio 6.0.0 元服务页面跳转失败
  • 机器翻译:模型微调(Fine-tuning)与调优详解
  • leetcode 1780. 判断一个数字是否可以表示成三的幂的和 中等
  • 新手入门Makefile:FPGA项目实战教程(二)
  • 达梦数据库使用控制台disql执行脚本
  • 【uni-app】根据角色/身份切换显示不同的 自定义 tabbar
  • 用Qt自带工具windeployqt快速打包程序
  • python自学笔记9 Seaborn可视化
  • ​​金仓数据库KingbaseES V9R1C10安装教程 - Windows版详细指南​
  • AXI4-Stream Switch IP核的用法
  • PyQt6实例_50个流通领域重要生产资料市场价格查看工具
  • Web 安全之 Cookie Bomb 攻击详解
  • Mac(一)常用的快捷键整理
  • 学习寻找自己感兴趣的事情--心理学入门的书籍
  • 「iOS」————UITableView性能优化
  • SpatialVLM和SpatialRGPT论文解读
  • OpenTelemetry WebSocket 监控终极方案:打通最后一公里
  • 【完整源码+数据集+部署教程】小鼠行为识别系统源码和数据集:改进yolo11-RFAConv
  • 区块链技术原理(11)-以太坊交易
  • 数据结构:N个节点的二叉树有多少种(Number of Binary Trees Using N Nodes)
  • Nacos-5--Nacos2.x版本的通信原理
  • 什么是KVM切换器?详解KVM切换器
  • 电子电气架构 --- 线束设计一些事宜
  • 电子电气架构 --- 探索软件定义汽车(SDV)的技术革新
  • 硬件实现webrtc的编解码