try-catch-finally的执行顺序

try-catch-finally的执行顺序

结论:

  1. 不管有没有出现异常,finally代码块都会执行;
  2. 不管try和catch的代码块中有return时,finally仍会执行,且如果finally代码块也有return,则此代码肯定会返回finally执行的return值。

分有return和没有return来讨论try-catch-finally执行顺序的情况:

1 无return

举个例子:

try {t();tt();
} catch (Exception e) {c();
} finally {f();
}
m();

1.1 当try中的t()没有抛出异常
因为没有捕捉到异常,那么执行try而不会执行catch,而finally无论如何都要执行。
其执行顺序为:t() --> tt() --> f() --> m()

1.2 当try中的t()抛出了异常
当 t() 中抛出异常,那么 t() 中从抛出异常的语句之后的代码以及 tt() 都不会执行, 程序会尝试捕捉异常。
捕捉Exception,捕捉成功,执行 c() ;
一旦捕捉到一个异常,不会再尝试捕捉其他异常,直接执行finally里的f();
执行后面的函数 m() 。
其执行顺序为:t() --> c() --> f() --> m()

2 有return

2.1

try{}
catch(){}
finally{}
return;

程序按顺序执行

2.2 try块中有return

try{return 1;}
catch(){}
finally{}
return 2;

程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return不再执行,因为程序在try中已经return过了。
结论:得到try中的返回值1。

2.3 catch块中有return

try{}
catch(){return 1;}
finally{}
return 2;

程序先执行try,如果遇到异常执行catch块,

  • 有异常:执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return。 finally之后的return不再执行。
  • 无异常:执行完try再finally再return。

结论:有异常影响catch,执行catch中的return得到返回值1。
2.4 try块和finally块中有return

try{return 1;}
catch(){}
finally{return 2;}
  • 无异常:程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出,而不再执行try中的return;
  • 有异常:不执行try,顺序执行catch-finally

结论:得到finally中的返回值2。

2.5 catch块和finally块中有return

try{}
catch(){return 1;}
finally{return 2;}
  • 无异常:执行try后跳过catch执行finally;得到finally的返回值2;
  • 有异常:程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。而不再执行catch中的return。

结论:得到finally中的返回值2。

2.6 try块、catch块和finally块中有return

try{return 1;}
catch(){return 2;}
finally{return 3;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;

  • 无异常:然后再执行finally块,因为finally块中有return所以提前退出。
  • 有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
    结论:得到finally中的返回值3。

3 总结
无return,无异常

try ->finally

无return,有异常

try(未出现异常的前半段) -> catch ->finally

try或catch中有return,无异常

try -> finally ->return(try)

try或catch中有return,有异常

try(未出现异常的前半段) -> catch ->finally->return(catch)

只要是finally中有return的情况
不论有没有异常,try或catch中有没有return

try/catch->return(finally)

我们可以看出当finally中有return的时候,相当于此代码肯定会返回该值。

4. 补充

public class ExceptionTest {int age;public static void main(String[] args) {System.out.println(test().age);}public static ExceptionTest test() {ExceptionTest test = new ExceptionTest();try {test.age = 10;return test;}catch (Exception e) {test.age = 20;return test;}finally {test = new ExceptionTest();test.age = 30;}}
}

输出:10
当 try-catch 块中有return 语句时,return 语句会暂存变量值,然后执行 finally 代码块。

总结:
1、不管有没有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。 最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。 如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的, 编译器把finally中的return实现为一个warning。

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

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

相关文章

java jdbc mysql url_java – 如何生成JDBC数据库URL?

我今天已经研究了大约3个小时,我觉得我很接近,但我有几个问题.我到目前为止找到的最好的信息来源是:https://stackoverflow.com/a/2840358,但它没有回答我的所有问题.一点背景:我正在使用Microsoft SQL Server 2014,并且我已经验证了IP地址127.0.0.1处于…

try catch finally 中包含return的几种情况,及返回结果

第一种情况:在try和catch中有return,finally中没有return,且finally中没有对try或catch中要 return数据进行操作的代码,这种情况也是最好理解的。 public class Test {public static int num1;public static void main(String[] …

java jp2launcher.exe_芯科cp2112有熟悉的吗?配置不能保存是什么原因?

文件夹PATH列表卷序列号为2474-602AC:.├─CP2112_SDK│ │ ReleaseNotes.txt│ ││ ├─Documentation│ │ ├─ApplicationNotes│ │ │ an495.pdf│ │ │ an496.pdf│ │ ││ │ ├─Datasheets│ │ │ CP2112.pdf│ │ ││ │ ├─Datash…

包装类的缓存问题

包装类的缓存问题 整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理,其目的是提高效率。 缓存处理的原理为:如果数据在-128~127这个区间,那么在类加载时就已经为该区间的每个数值创建…

java中项目启动时加载_如何在项目启动时,加载或解析某配置文件

在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件、初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作。在工作中遇到了项目初始数…

Shiro介绍及主要流程

Shiro介绍及主要流程 什么是Shiro Apache Shiro是一个强大且灵活的开源安全框架,易于使用且好理解,撇开了搭建安全框架时的复杂性。 Shiro可以帮助我们做以下几件事: 认证使用者的身份 提供用户的访问控制,比如: 决定…

java数据库程序实例_Java连接各种数据库的实例大全

1、Oracle8/8i/9i数据库(thin模式)Class.forName(“oracle.jdbc.driver.OracleDriver”)。newInstance();String url“jdbc:oracle:thin:localhost:1521:orcl”;//orcl为数据库的SIDString user“test”;String password“test”;Connection conn DriverManager.get…

http的请求体body的几种数据格式

文章目录multipart/form-dataapplication/x-www-from-urlencodedrawbinarypostman中 Params和Body的区别multipart/form-data 以表单形式提交,主要是上传文件用它,在http中格式为 application/x-www-from-urlencoded 以键值对的数据格式提交 raw…

谷歌浏览器安装json格式化插件

谷歌浏览器安装json格式化插件 实际开发工作中经常用到json数据,那么就会有这样一个需求:在谷歌浏览器中访问URL地址返回的json数据能否按照json格式展现出来。 比如,在谷歌浏览器中访问:http://jsonview.com/example.json 展现…

java 俄罗斯方块窗口_[代码全屏查看]-java 俄罗斯方块

[1].[代码] [Java]代码package com;import java.awt.Color;import java.awt.Graphics;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Random;import javax.swing.JFrame;import javax.swing.JPanel;public class Eluos extends JFrame{p…

vue3.0中使用Element-plus默认英文组件修改为中文

vue3.0中使用Element-plus默认英文组件修改为中文修改方法 说明:本方法Element-plus 1.0.2-beta.59 之前的版本可以,1.0.2-beta.59之后版本请看下一篇博客 1,引入element // ! element-plus vue3.0 import element from element-plus import element-…

在java中null的作用_在java中避免使用!= null有什么好处?

使用空集合或“空白”操作而不是null的主要优点是,大多数情况下,此类对象仍然可以在代码中工作而无需进一步修改.从本质上来说,空值更容易出错.请使用以下代码,例如:String[] names data.getNames();if (names ! null) {for (String name : names) {// Do stuff}}需…

新版Elemen Plus 国际化 1.0.2-beta.59(包含59)

根据官方文档可以找到解决办法。先来看一下官方文档内容 官方给出了两种方式。这里只研究第一种方式&#xff1a; <template><el-config-provider :locale"locale"><App /></el-config-provider> </template><script> import …

java开发亚马逊mws_GitHub - iotwlw/Amazon-MWS-SDK: 基于亚马逊MWS Java SDK 的封装

amazon-mws-java-sdk亚马逊MWS服务的Java-SDK封装安装在pom.xml中添加依赖top.guyi.amazonAmazon-MWS-SDK1.0.0.1依赖放在nexus私服中&#xff0c;并没有上传到中央仓库&#xff0c;所以请在pom.xml中加入仓库配置guyi-maple-nexushttp://nexus.guyi-maple.space/nexus/content…

oracle数据库中索引会失效的几种情况

创建Oracle 索引的目的是为了避免全表扫描数据&#xff0c;提高查询效率&#xff0c;但是如果sql语句写的不好致使索引失效&#xff0c;反而会影响数据查询效率。以下几种情况就会导致索引失效&#xff1a; 1. 没有 WHERE 子句 众所周知&#xff0c;添加索引的字段必需要在whe…

JAVA跑步计时器app_坚持跑步神器app

&#xfeff;坚持跑步神器app&#xff0c;让坚持不了自己跑步训练的人能够完成自己的训练目标&#xff0c;特色的惩罚系统时刻监督你跑步&#xff0c;不需要GPS就可以实现&#xff0c;非常方便&#xff0c;快来下载吧坚持跑步神器app介绍坚持跑步神器&#xff0c;设定每天跑步多…

java 中 BigDecimal 详解

首先&#xff0c;学习一个东西&#xff0c;我们都必须要带着问题去学&#xff0c;这边我分为 【为什么&#xff1f;】【是什么&#xff1f;】【怎么用&#xff1f;】 【为什么要用BigDecimal&#xff1f;】 首先&#xff0c;我们先看一下&#xff0c;下面这个现象 那为什么会…

三星s7不能运行java_在调试模式下启动时Android应用程序崩溃

当我在 debug 模式下运行时&#xff0c;应用程序崩溃了&#xff0c;但是当我正常运行它时它会起作用 . 我认为附加调试器时会出现问题 .日志&#xff1a;A/art: art/runtime/jdwp/jdwp_event.cc:661] Check failed: Thread::Current() ! GetDebugThread() (Thread::Current()0x…

关于vue-cli3中配置请求跨域的问题

关于vue-cli3中配置请求跨域的问题 根据Vue CLI3官方文档&#xff0c; 需要在vue.config.js文件中配置devServer.proxy选项来解决跨域问题。 1.关于vue.config.js文件 此文件在vue-cli3中不会自动生成&#xff0c;需要手动在项目根目录下创建。 2.配置devServer.proxy选项…

java单元测试内存数据库_基于内存数据库的单元测试

背景&#xff1a;当我们在进行单元测试时&#xff0c;对于关系型数据库(例如mysql)和非关系型数据库(例如redis)的处理&#xff0c;有的小伙伴通过mock的方式制作出假的数据进行测试&#xff0c;有的小伙伴会连到开发环境操作数据库。而连到开发环境&#xff0c;会受到很多限制…