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语句执行前被执行还是执行后被执行?的更多相关文章

  1. 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)

    Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...

  2. Java异常处理中finally中的return会覆盖catch语句中的return语句

    Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...

  3. Java中try catch finally语句中含有return语句的执行情况(总结版)

    在这里看到了try >但有一点是可以肯定的,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也 ...

  4. Java中try catch finally语句中含有return语句的执行情况

    finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面 ...

  5. python 中 try catch finally语句中含有return语句的执行情况

    无论是在try还是在except中,遇到return时,只要设定了finally语句,就会中断当前的return语句,跳转到finally中执行,如果finally中遇到return语句,就直接返回, ...

  6. Java中try catch finally语句中含return语句的执行情况总结-编程陷阱

    前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...

  7. python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数

    1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  8. 0016 Java学习笔记-异常-如果try-catch-finally中都存在return语句会怎样?

    上午在搜索"System.runFinalization"的时候,搜到 http://www.cnblogs.com/Skyar/p/5962253.html ,其中有关于try- ...

  9. 函数----基础,参数传递,返回类型和return语句

    一.函数基础1.形参和实参 实参是形参的初始值.第一个实参初始化第一个形参,第二个实参初始化第二个形参,以此类推.尽管实参与形参存在对应关系,但是并没有规定实参的求值顺序.编译器能以任意可行的顺序对实 ...

随机推荐

  1. SQlL Server ----- 通过年月进行查询

    websit  中的代码. 不修改 对控件进行修改,展示年月 WdatePicker({ dateFmt: 'yyyy-MM', isShowToday: false, isShowClear: fa ...

  2. SpringBoot加载自定义yml文件

    自定义配置文件(跟SpringBoot的application.yml同一目录下): nlu-parse-rule: title: "NLU响应结果解析规则" desc: &quo ...

  3. PHP多进程编程初步

    转自:https://www.pureweber.com/article/php-multi-process-programming-preview/ 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是 ...

  4. 【转】python测试框架--doctest

    转自https://my.oschina.net/lionets/blog/268542 doctest 是一个 Python 发行版自带的标准模块.有两种模式可供使用. ##1 doctest 的概 ...

  5. Python知识点总结篇(二)

    列表 列表:一个值,包含多个字构成的序列,用[ ]括起来,[]是一个空列表,不包含任何值,类似于空字符串,负数下标表示从后边开始,-1表示列表最后一个下标,它是一种可变的数据类型,值可以添加.删除或改 ...

  6. 【LEETCODE】71、验证二叉树的前序序列化

    简单粗暴,代码有待优化,不过自己独立完成,没有参考任何材料,还是比较满意的 package y2019.Algorithm.stack.medium; import java.util.Stack; ...

  7. python3 简陋的学生信息管理系统

    # 编写一个“学生信息管理系统”# 输入序号:1. 输入学生信息,学生信息包括:id,name,age,gender(用什么数据类型保存?)# 2. 查询:输入学生姓名和id,显示学生个人信息# 3. ...

  8. [cf 1236 E] Alice and the Unfair Game

    题意: 给定一个长度为m的序列$A$,你有一个长度为n的棋盘,可以任选一个位置x作为起点. 在时刻$[1,m+1]$你可以向左或向右移动一格. 设时刻i你移动后所在的位置为$B_i$,你需要满足对于任 ...

  9. Elasticsearch7.3使用内置的JDK12

    汇总:采用最简单的办法,就是在elasticsearch文件开头添加上这一行export JAVA_HOME=/home/vdb1/elastic_cluster/elasticsearch-7.3. ...

  10. 回归写博客时间-----CeliaTodd

    2019-10-17-19:28:01 记录自己的学习路程 国庆期间本来是有持续写博客的,但是有各种原因就没时间写博客了, 但是学习的进度还是没有落下的,现在正式回归写博客的时间了. 但现在不是写Py ...