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. Python定时偷取妹子Chrome上网记录

    原文:教大家一招用Python实时监控自己的女朋友每天上网都在做什么! 参考这个思路,尝试自己实现一下 读取Chrome历史记录文件 1.文件可在以下路径找到,这是个sqllite数据库文件 C:\U ...

  2. 手撕面试官系列(五):Tomcat+Mysql+设计模式面试专题

    Tomcat (面试题+答案领取方式见侧边栏) Tomcat 的缺省端口是多少,怎么修改? tomcat 有哪几种 Connector 运行模式(优化)? Tomcat 有几种部署方式? tomcat ...

  3. 【题解】Luogu P1357 花园

    原题传送门 我们先将花圃断环为链,并将\([1,m]\)复制一份到\([n+1,n+m]\),最后要求\([1,n+m]\)是合法序列且\([1,m]\)与\([n+1,n+m]\)相等的序列的数量即 ...

  4. easyUi——datetimebox绑定数据失效

    在做easy-ui时候,绑定数据不管在怎么写,都绑定不上去,最后发现是因为 标签的ID没有写,尴尬了,记录一下,防止后期出错. ui代码 <script type="text/java ...

  5. Python进阶----异常处理

    Python进阶----异常处理 一丶错误和异常   错误:       语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 ...

  6. Python基础知识(八)----文件操作

    文件操作 一丶文件操作初识 ###f=open('文件名','模式',编码): #open() # 调用操作系统打开文件 #mode #对文件的操作方式 #encoding # 文件的编码格式 存储编 ...

  7. rename file

    https://askubuntu.com/questions/790633/the-o-parameter-in-aria2c-cant-rename-the-downloaded-file You ...

  8. pandas-12 数学计算操作df.sum()、df.min()、df.max()、df.decribe()

    pandas-12 数学计算操作df.sum().df.min().df.max().df.decribe() 常用的数学计算无非就是加减,最大值最小值,方差等等,pandas已经内置了很多方法来解决 ...

  9. MySQL-By孙胜利-sifangku.com

    一.数据库基本概念 数据库:信息存储的仓库,包括一系列的关系措施! 表:一个数据库中可以有若干张表(形式上你可以看出我们日常生活中建立的表) 字段:表里面的信息会分若干个栏目来存,这些栏目呢,我们在数 ...

  10. github上传本地项目代码

    进入github首页,点击新项目new repository,如下图所示: 然后进入如下页面,填写信息: 最后点击Create repository,生成如下页面: 红色圈圈画的步骤,先点击Clone ...