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. Angular 修改路由策略,改为使用hash路由,即带#号URL

    修改app.module.ts如下  

  2. netcore发布失败

    2.2  发布Views  <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish> 导致 发布失败--------- ...

  3. Flutter 增加三方库卡在flutter package get 的解决办法

    修改 pubspec.yaml 文件增加第三方库之后,AndroidStudio 像往常一样提示 需要 package get. 然后一直卡在 Running "flutter packag ...

  4. Python全栈开发相关课程

    Python全栈开发 Python入门 Python安装 Pycharm安装.激活.使用 Python基础 Python语法 Python数据类型 Python进阶 面向对象 网络编程 并发编程 数据 ...

  5. 【1】【leetcode-72 动态规划】 编辑距离

    (没思路,很典型,重要) 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替 ...

  6. Chrome 谷歌开发者工具使用窍门

    我们这里介绍主要的几块:Console.Source.Network Console 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的, ...

  7. js的splice和delete

    例如有一个数组是 :var textArr = ['a','b','c','d']; 这时我想删除这个数组中的b元素: 方法一:delete 删除数组 delete textArr[1]  结果为: ...

  8. C# vb .net实现颜色替换效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的颜色替换效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  9. 使用poi调整字体格式、添加单元格注释、自动调整列宽

    1 创建新的工作铺 import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFCell; import org ...

  10. SQL Server安装教程(超详细)

    具体教程:https://zijian1998.github.io/2018/03/14/Microsoft%20SQL%20Server%202017%E4%B8%8B%E8%BD%BD%E5%AE ...