热门标签 | 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 块的执行逻辑及其在不同情况下的行为表现。


推荐阅读
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 深入理解线程池及其基本实现
    本文探讨了线程池的概念、优势及其在Java中的应用。通过实例分析不同类型的线程池,并指导如何构建一个简易的线程池。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
  • D17:C#设计模式之十六观察者模式(Observer Pattern)【行为型】
    一、引言今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份& ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 本文深入探讨了WPF框架下的数据验证机制,包括内置验证规则的使用、自定义验证规则的实现方法、错误信息的有效展示策略以及验证时机的选择,旨在帮助开发者构建更加健壮和用户友好的应用程序。 ... [详细]
  • 本文详细探讨了在Java编程语言中,构造函数、静态代码块和构造代码块的执行顺序。首先明确了静态代码块、构造代码块以及构造函数方法体的执行优先级,随后深入分析了构造函数体执行前的具体步骤,包括父类构造器的调用、非静态变量的初始化等。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
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社区 版权所有