热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

探讨try-finally结构中finally块的执行情况

本文深入分析了Java中try-finally结构的执行机制,特别是探讨了在不同情况下finally块是否会得到执行。

探讨 try-finally 结构中 finally 块的执行情况


在 Java 编程语言中,try-finally 结构用于确保一段代码无论是否发生异常都能被执行。但是,对于 finally 块是否会始终执行,存在一些特殊情况需要我们注意。


结论概览:



  • 如果在 try 块之前就已经返回结果,则 finally 块不会被执行。

  • try 块内抛出异常,会先执行 catch 块(如果有的话),然后执行 finally 块。

  • 如果 try 块或 catch 块中有返回语句,finally 块仍然会被执行,但其内的返回语句会覆盖之前的返回值。


案例分析


1. 在 try 块前返回结果


public class Demo01 {
private static int test() {
int i = 1;
if (i == 1) return i;
try {
System.out.println("执行try");
} finally {
System.out.println("执行finally");
}
return 0;
}

public static void main(String[] args) {
System.out.println("执行main:" + test());
}
}

此例中,由于在 try 块前已返回结果,因此 finally 块不会被执行。


2. try 块内抛出异常


public class Demo02 {
private static int test02() {
try {
System.out.println("执行try");
return 1 / 0;
} catch (Exception e) {
System.out.println("执行catch");
return 11;
} finally {
System.out.println("执行finally");
}
}

public static void main(String[] args) {
System.out.println("执行main:" + test02());
}
}

在这个例子中,try 块内发生了除零错误,因此跳转到 catch 块,并最终执行 finally 块。


3. try 块内有返回语句


public class Demo03 {
private static int test03() {
int i = 0;
try {
System.out.println("执行try:" + i);
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
}
}

public static void main(String[] args) {
System.out.println("执行main:" + test03());
}
}

这里,尽管 try 块中有返回语句,但 finally 块仍然会执行,不过最终返回的是 try 块中的值。


4. tryfinally 块中均有返回语句


public class Demo04 {
private static int test04() {
try {
System.out.println("执行try");
return 1;
} finally {
System.out.println("执行finally");
return 2;
}
}

public static void main(String[] args) {
System.out.println("执行main:" + test04());
}
}

在这个场景下,虽然 try 块中有返回语句,但由于 finally 块也包含返回语句,因此最终返回的是 finally 块中的值。


5. 进一步理解 tryfinally 块中均有返回语句的情况


public class Demo05 {
private static int test05() {
int i = 1;
try {
System.out.println("执行try:" + i);
i++;
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
return i;
}
}

public static void main(String[] args) {
System.out.println("执行main:" + test05());
}
}

此例进一步展示了即使 try 块中有返回语句,finally 块中的返回语句依然会覆盖前者的结果。




通过上述案例,我们可以更全面地理解 try-finally 结构中 finally 块的执行逻辑及其在不同情况下的行为表现。


推荐阅读
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • andr ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文探讨了《魔兽世界》中红蓝两方阵营在备战阶段的策略与实现方法,通过代码展示了双方如何根据资源和兵种特性进行战士生产。 ... [详细]
  • 本文介绍了几种不同的编程方法来计算从1到n的自然数之和,包括循环、递归、面向对象以及模板元编程等技术。每种方法都有其特点和适用场景。 ... [详细]
author-avatar
静卍谧梁言_250
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有