【Java基础篇】try catch finally语句包含return语句时的执行过程

网上有很多人探讨Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行?

很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被

  • try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
  • 在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

当然还有很多人探讨finally语句的执行与return的关系,我这里总结一段话来说明整个的执行过程:

  1. 首先try语句如果没发生异常,会执行try语句return后面的表达式,确定try语句返回的值
  2. 如果try语句发生异常,那么会执行catch语句return后面的表达式,确定catch语句返回的值
  3. 除了上面说的两种情况,其他情况都会执行到finally语句,会执行finally语句return后面的表达式,确定finally语句返回的值
  4. 最后确定返回值,如果finally语句有执行到,并且有return语句,那么返回值就是finally语句的返回值,否则返回值是try语句的返回值或者catch语句的返回值

下面我举例说明:

测试用例1:

 
public class FinallyTest2 {public static void main(String[] args) {System.out.println(test2());}public static int test2() {int b = 20;try {System.out.println("try block");return b += 80;} catch (Exception e) {System.out.println("catch block");} finally {System.out.println("finally block");if (b > 25) {System.out.println("b>25, b = " + b);}return 200;}// return b;}}

运行结果是:

try block
finally block
b>25, b = 100
200

执行过程分析:

  1. 执行第15行,b值为100,第15行变成return 100;
  2. 执行到23行,因为b这时候的值是100,所以会执行24行
  3. 执行到27行,会直接返回200(前面说过了finally语句的返回值会覆盖try或者catch的返回值)

测试用例2:

 
public class FinallyTest3 {public static void main(String[] args) {System.out.println(test3());}public static int test3() {int b = 20;try {System.out.println("try block");return b += 80;} catch (Exception e) {System.out.println("catch block");} finally {System.out.println("finally block");if (b > 25) {System.out.println("b>25, b = " + b);}b = 150;}return 2000;}
}

运行结果是:

try block
finally block
b>25, b = 100
100

执行过程分析:

  1. 执行第15行,b值为100,第15行变成return 100;
  2. 执行到23行,因为b这时候的值是100,所以会执行24行
  3. 执行到27行,b的值虽然变成了150,但是这个时候finally语句执行完了,然后会返回第15行的结果return 100;

测试用例3:

 
import java.util.*;public class FinallyTest6
{public static void main(String[] args) {System.out.println(getMap().get("KEY").toString());}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;}
}

运行结果是:

FINALLY

执行过程分析:

  1. 执行第16行,第16行变成return map对象的内存地址;
  2. finally语句执行完了之后,map对象存储的内容为KEY-FINALLY,然后会返回到第16行,方法返回map对象的内存地址
  3. 打印map对象的value,结果肯定是FINALLY啦。

关于try catch finally语句网上有很多分析的文章,我觉得其实记住两点就行了,一个是执行return语句的时候,会将return语句后面表达式的值计算出来并且后面不再变化,另外一个是return语句的覆盖问题,后面的return语句会覆盖前面的return语句。记住这两点再去分析try catch finally语句就很容易了。

 

 

 

 

 

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

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

相关文章

eclipse指定JDK版本启动,解决version XXX of the JVM is not suitable for this product.Version:XXX 问题

问题描述&#xff1a;启动eclipse时&#xff0c;提示version 1.7.0 of the JVM is not suitable for this product.Version:1.8 or greater is required. 原因分析&#xff1a;原因是我的笔记本安装了多个JDK版本&#xff0c;但是现在我的JAVA_HOME配置的是jdk1.7的路径&#x…

【JAVA基础篇】Socket编程

一、Socket的概念 Socket是一种通讯机制&#xff0c;通常称为套接字。英文原意是插座&#xff0c;顾明思义&#xff0c;Socket像是一个多孔插座&#xff0c;可以提供多个端口的连接服务 ps:至于socket在计算机术语中怎么就翻译成了“套接字”这个令人费解的词&#xff0c;这真…

【JAVA基础篇】注解

一、什么是注解&#xff1f; 注解是元数据&#xff0c;所谓元数据就是描述数据的数据。 在annotation诞生之前&#xff08;jdk1.5诞生了注解&#xff09;&#xff0c;甚至之后&#xff0c;xml被广泛的由于描述元数据。但是后来&#xff0c;有一些应用开发工程师和架构师觉得它…

【JAVA基础篇】IO流

一、流的概念 “对语言设计人员来说&#xff0c;创建好的输入&#xff0f;输出系统是一项特别困难的任务。” ――《Think in Java》 无论是系统、还是语言的设计中IO的设计都是异常复杂的。面临的最大的挑战一般是如何覆盖所有可能的因素&#xff0c;我们不仅仅要考虑文件、…

SpringMVC注解

一&#xff0c;RequestMapping 可以用在类和方法上 1.1 作用&#xff1a; 将客户端请求映射到可匹配的类和方法中 1.2 属性&#xff1a; name 给映射指定一个名字 path(同value相同&#xff09; 请求的url&#xff0c;path{"/mixedAttribute1","/mixedA…

【JAVA基础篇】运算符

一、表达式 表达式由运算符和操作数组成 例如&#xff1a; 5 num1 num1num2 sumnum1num2 二、运算符分类 算数运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符、位运算符 三、算数运算符 四、赋值运算符 格式&#xff1a;变量表达式 例如&#xff1a;int n3…

a4纸网页打印 table_打印模板不愁人,你还在打印单调的A4纸吗?

软件介绍早在几年前&#xff0c;社会上就已经开始了数字化、无纸化的推广&#xff0c;但是就算再怎么无纸化&#xff0c;纸张还是有它必要的存在&#xff0c;在工作、学习过程中&#xff0c;打印的需求也必不可少的。但是一般的打印都是比较平庸的&#xff0c;要做会议记录&…

IP地址、子网掩码、网关、默认网关、DNS的理解

IP地址 Internet上为了区分数以亿计的主机而给每个主机分配一个专门的地址&#xff0c;通过IP地址可以访问到每台主机。 子网掩码 子网掩码又称网络掩码、地址掩码、子网络遮罩。它是用来指明一个IP地址哪些位标识的是主机所在的子网&#xff0c;以及哪些位标识的是主机的位…

上证指数30年k线图_技术预判2020:上证指数要突破3500点才会“井喷”

2019年的行情很快就要收官了&#xff0c;截止目前&#xff0c;上证指数今年的涨幅是20.5%&#xff0c;不过可能有部分投资者今年的收益率还没达到大盘指数的平均水平。不管怎样&#xff0c;今年很快就要翻篇了&#xff0c;关键是看2020年股市能不能迎来更好的行情了。而总结得失…

【JAVA基础篇】基本数据类型及自动类型转换

一、8种基本数据类型以及占用内存空间大小 boolean 1byte或4byte byte 8bit/1byte char 16bit/2byte short 16bit/2byte float 32bit/4byte int 32bit/4byte long 64bit/8byte double 64bit/8byte 二、自动类型转换 …

的优缺点_浅谈桉木家具的优缺点

家具现在的材质是有很多的&#xff0c;木质的&#xff0c;石材的&#xff0c;还有真空充气的&#xff0c;都是很不错的类型。桉木家具是现在很多人都喜欢的一种材质&#xff0c;但是很多人对桉木家具的优缺点不是很清楚&#xff0c;为了能够让大家更加清楚的了解桉木家具&#…

【算法篇】递归

一、递归的概念 程序调用自身的编程技巧称为递归。 递归的核心思想就是将一个大规模复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。 二、递归的优点 使用递归的好处是只需要少量的代码就可以描述出求解问题过程中多次重复的计算&#xff0c;大大减少了程序…

客户说发货慢怎么回复_女生微信说身体不舒服怎么回复关心她?

当你不在女生身边&#xff0c;女生微信给你说身体不舒服&#xff0c;肯定需要说点话来安慰她了。多喝热水肯定是不行了&#xff0c;一点用处都没有&#xff0c;还会让女生觉得你根本不重视她&#xff0c;是在敷衍她&#xff0c;那女生微信说身体不舒服怎么回复关心她呢&#xf…

【算法篇】八种内排序算法

常用的八种内排序算法分别是&#xff1a; 交换排序&#xff1a;冒泡排序、快速排序选择排序&#xff1a;简单选择排序、堆排序插入排序&#xff1a;直接插入排序、希尔排序归并排序基数排序 内排序巧记&#xff1a;选(选择)舰(简单选择)队(堆)的时候脚(交换)毛(冒泡)快(快速)&…

数据分析专题报告范文6篇_小学生看图写话范文:小熊玩跷跷板?(6篇),让孩子参考练习...

​范文01&#xff1a;小熊跷跷板一天&#xff0c;天气晴朗&#xff0c;胖乎乎的小熊和小白兔一起玩跷跷板。小熊一屁股坐在地上&#xff0c;小白兔说&#xff1a;“啊&#xff01;我有恐高症哇&#xff01;”小熊说&#xff1a;“我比你重&#xff0c;所以你没有办法把我翘起来…

PL/SQL

1 PL/SQLPL/SQL:过程化SQL语言&#xff08;Procedural Language/SQL&#xff09;。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点&#xff0c;所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中&#xff0c;通过逻辑判断、循环…

20sccm_SCCM 2012安装图解教程(一步一步详细步骤)

本系列文章的环境架构如下图所示&#xff1a;所有服务器安装的操作系统都是windows Server 2008 R2 中文企业版。计算机名软件、版本及角色SC-DC.SC.COMwindows Server 2008 R2 Enterprise /Active Directory 2008 R2SC-SQL.SC.COMSQL Server 2008 R2 EnterpriseSC-SCCM.SC.COM…

【Java中级篇】Dom4j解析xml数据

一、依赖 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> 二、test.xml <?xml version"1.0" encoding"UTF-8"?> <students>…

redis 附近的人_使用redis—geo api实现搜索附近的人,自己写的一个composer包

安装如果是应用在项目当中的话找到根目录&#xff0c;需要和 composer.json同级composer require gaopengfei/redis_lbs基本操作初始化require_once __DIR__./vendor/autoload.php;$lbs new \LBS\Services\LBSService();添加$add_params [[name > yabao_road,long > 11…

【Java中级篇】使用zxing生成二维码

一、pom.xml添加依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifa…