finall语句是在return语句执行前被执行还是执行后被执行?
finally对try...catch的影响和执行时间
一.finally语句不被执行的两种情况
我们在学习抛出异常的时候学习到了finally语句块,这个语句块一般会被执行,但是有两种情况下不被执行
1.如果try语句或者catch语句里存在强制退出语句System.exit(0),代表虚拟机被终止。
2.在执行try...catch语句前已经有了return语句返回,后面的程序不再被执行。
二.finally语句什么时候被执行
我们进行以下测试:
public class Test{
public static void main(String[] args) {
System.out.println(test1());
}
public static int test1() {
int b = ;
try {
System.out.println("try block");
return b += ;
}
catch (Exception e) {
System.out.println("catch block");
}
finally {
System.out.println("finally block");
if (b > ) {
b=200;
System.out.println("b>25, b = 200");
}
}
return b;
}
}
执行结果为:
try block
finally block
b>, b = 2
以上结果说明:在try中的return语句已经执行了,这时没有进行返回操作,而是转而进入到finally语句中去执行,finally语句执行完后,在进行返回操作。
二.return位置不同造成的不同结果
我们可以从两种情况进行分析:
1.finally语句中没有return。
2.finally语句中有return。
对于第一种情况我们已经做了测试,如上面的代码所示,finally语句中对b进行了改值操作,但是返回值依然是try中的b值,原理是当在try中执行b += 80;操作后,将b值临时存储在栈中,并将运算结果赋值给b,这是会进行一个保护操作,会把b存储到另一个局部变量中进行保护性存储,然后进入finally语句中,将栈中的b值进行更改,但是在进行返回操作时,会将保护存储变量中的值重新返回到栈顶中,return进行出栈操作,将try中的b取出来。
详情可以参考:https://blog.csdn.net/abinge317/article/details/52253768
如果finally中有return,我们就会在finally中进行返回。
示例如下:
public int test() {
int i=;
try {
i = ;
return i;
} finally {
i = ;
return i;
}
}
结果为2;
但是如果return的不是基本数据类型,而是引用数据类型,那么及时finally语句块中没有return,数据也会改变。String类除外。
为什么引用数据类型都可以,String就不行哪?是因为String有安全保护机制。可以参考这篇文章https://www.cnblogs.com/zzuli/p/9381266.html
finall语句是在return语句执行前被执行还是执行后被执行?的更多相关文章
- 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)
Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...
- Java异常处理中finally中的return会覆盖catch语句中的return语句
Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...
- Java中try catch finally语句中含有return语句的执行情况(总结版)
在这里看到了try >但有一点是可以肯定的,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也 ...
- Java中try catch finally语句中含有return语句的执行情况
finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面 ...
- python 中 try catch finally语句中含有return语句的执行情况
无论是在try还是在except中,遇到return时,只要设定了finally语句,就会中断当前的return语句,跳转到finally中执行,如果finally中遇到return语句,就直接返回, ...
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...
- python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...
- 0016 Java学习笔记-异常-如果try-catch-finally中都存在return语句会怎样?
上午在搜索"System.runFinalization"的时候,搜到 http://www.cnblogs.com/Skyar/p/5962253.html ,其中有关于try- ...
- 函数----基础,参数传递,返回类型和return语句
一.函数基础1.形参和实参 实参是形参的初始值.第一个实参初始化第一个形参,第二个实参初始化第二个形参,以此类推.尽管实参与形参存在对应关系,但是并没有规定实参的求值顺序.编译器能以任意可行的顺序对实 ...
随机推荐
- 【转帖】HBase简介(梳理知识)
HBase简介(梳理知识) https://www.cnblogs.com/muhongxin/p/9471445.html 一. 简介 hbase是bigtable的开源山寨版本.是建立的hdf ...
- linux 下 jmeter 配置
一.在Linux服务器先安装sdk 1.先从客户端下载jdk1.8.0_144.tar.gz,再上传到服务器 2.解压:tar -xzf jdk1.8.0_144.tar.gz,生成文件夹 jdk1. ...
- 基于layUI调用后台数据实现区域信息级联查询
基于layUI调用后台数据实现区域信息级联查询 1.基本思路 后台提供根据区域编码查询区域列表公共接口 页面初始化调用后台接口加载所有省份 点击省份将省份区域编码传入后台查询该省份下所有地市信息,以此 ...
- ZLC众利币系统APP开发
开发版本:APP 开发语言:php,java,.net 下面我们来看一下tp5 分页具体怎么用: 一, 分页简洁版 简洁分页仅仅只有上下页的分页输出,可以使用下面的简洁分页代码: // 查询状态为1的 ...
- ubuntu查看软件安装位置
ubuntu中的软件可通过图形界面的软件中心安装,也可以通过命令行apt-get install安装.但是安装后的软件在哪个位置呢?这点跟windows环境下安装软件的路径选择不一样.ubuntu中可 ...
- Kibana访问报错
浏览器访问提示:Kibana server is not ready yet 查看日志如下 {"type":"log","@timestamp&quo ...
- asp.net core 3.1 中Synchronous operations are disallowed. Call FlushAsync or set AllowSynchronousIO to true instead
在Action中解决措施: var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>(); if (syn ...
- redis三种集群策略
主从复制 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库 从数据库一般都是只读的,并且接收主数据库同步过来的数据 一个master可以拥有多个slave,但是一个slav ...
- C# vb .net实现胶片效果滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的胶片效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- P1349 广义斐波那契数列(矩阵乘法)
题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...