finally块在代码中什么时候被执行?

在Java语言的异常处理中,finally块的作用十九为了保证无论出现什么情况,finally块里面的代码一定会被执行。由于程序执行return就以为这结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return执行(除非碰到exit函数),因此,finally块里面的代码也是在return前执行的。此外,如果try-finally或者catch-finally中都有return,那么finally块中的return语句将会覆盖别处的return语句,最终返回调用者那里的是finally中return的值。

public class Main {
public static int testFinally(){
try{
return 1;
}catch (Exception e){
return 0;
}finally {
System.out.println("执行Finally");
}
} public static void main(String[] args) {
int result = testFinally();
System.out.println(result);
}
}
//执行结果
执行Finally
1

再看下面这段程序的执行

 public static int testFinally2(){
try{
return 1;
}catch (Exception e){
return 0;
}finally {
System.out.println("执行Finally");
return 3;
}
}
public static void main(String[] args) {
int result = testFinally2();
System.out.println(result);
}
//结果为
执行Finally
3

从以上运行的结果可以看出,当finally块中有return语句是,将会覆盖函数中其他的return语句。此外,由于在一个方法内部定义的变量都存储在栈中,当这个函数结束后,其对应的栈就会被收回,此时在其方法体中定义的变量将不存在,因此return在返回是不是直接返回变量的值,而是复制一份,然后返回。因此,对于基本数据类型,在finally块中改变return的值对返回值没有任何影响,而对引用类型的数据会有影响。

 public static int testFinally2(){
try{
return 1;
}catch (Exception e){
return 0;
}finally {
System.out.println("执行Finally");
return 3;
}
} public static int testFinally3(){
int result = 1;
try{
result=2;
return result;
}catch (Exception e){
return 0;
}finally {
result = 3;
System.out.println("执行Finally");
} }
public static StringBuffer testFinally4(){
StringBuffer s = new StringBuffer("Hello");
try{
return s;
}catch (Exception e){
return null;
}finally {
s.append(" world!");
System.out.println("执行Finally");
}
}
public static void main(String[] args) {
int result = testFinally3();
System.out.println(result);
StringBuffer result2 = testFinally4();
System.out.println(result2);
}
//执行结果
执行Finally
2
执行Finally
Hello world!

程序在执行到return是会首先将返回值存储在一个指定的位置,其次去执行finally块,最后在返回。以上连个例子说明了执行finally块时,会改变引用类型的变量,而对基础类型没有影响。

还有就是,Java程序中finally块不是一定会运行,若程序在try之前便发生错误,则程序会中断,而不会继续执行。

同样,当程序内存在exit函数时,程序也会直接中断,不会继续执行。

finally块执行时间的更多相关文章

  1. console.time测试代码块执行时间

    console.time('计时器'); for (var i = 0; i < 1000; i++) { for (var j = 0; j < 1000; j++) {} } cons ...

  2. this关键字、static关键字、block块、封装类以及继承、import、修饰符的初步了解

    this关键字 定义 在类的方法定义中使用this关键字代表使用该方法的引用. this即"自己",代表对象本身,谁调用代表谁.在成员方法中或构造器中隐式的传递. this的两种用 ...

  3. 记一次synchronized锁字符串引发的坑兼再谈Java字符串

    问题描述 业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间.并发下,取IP是有一定策略的,取到IP之后拿IP对应的C ...

  4. 记一次 synchronized 锁字符串引发的坑兼再谈 Java 字符串

    业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间. 并发下,取IP是有一定策略的,取到IP之后拿IP对应的COOKI ...

  5. java并发编程(1) --并发基础及其锁的原理

    引言 多线程的知识点是一个庞大的体现,对此也是一知半解.一直想系统的深入的学习多线程的知识,奈何一直没有找到机会,好吧,其实就是懒.最近在项目中接触到一个多并发的项目,在项目中踩了无数的坑.在此下定决 ...

  6. JAVA核心技术I---JAVA基础知识(单例模式和final关键字)

    一:单例模式 C++设计模式中提及,不再赘述设计模式---对象性能模式之单例模式(Singleton) public class single{ static single Instance=new ...

  7. Chrome 开发者控制台中,你可能意想不到的功能

    Chrome 有内置的开发者工具.它拥有丰富的特性,比如元素(Elements).网络(Network)和安全(Security).今天,我们主要关注一下 JavaScript 控制台. 当我最初写代 ...

  8. JAVA锁的优化和膨胀过程

    转自:https://www.cnblogs.com/dsj2016/p/5714921.html https://cloud.tencent.com/developer/article/103675 ...

  9. (转)Springboot定时任务

    在我们的项目开发过程中,经常需要定时任务来帮助我们来做一些内容,springboot默认已经帮我们实行了,只需要添加相应的注解就可以实现 1.pom包配置 pom包里面只需要引入springboot ...

随机推荐

  1. Matlab自带常用的分类器,直接复制用就好了,很方面。

    很方面的,懒得自己写了. clc   clear all     load('wdtFeature');         %   训练样本:train_data             % 矩阵,每行 ...

  2. KoaHub.JS基于Node.js开发的Koa 生成验证码插件代

    ccap node.js generate captcha using c++ library CImg without install any other lib or software node- ...

  3. koa中间件系统原理及koa+orm2实践。

    koa是由 Express 原班人马打造的新的web框架.套用其官方的说法:Koa 应用是一个包含一系列中间件 generator 函数的对象. 这些中间件函数基于 request 请求以一个类似于栈 ...

  4. oracle 实例启动报错(ORA-01078: failure in processing system parameters )

    在启动Oracle数据库时报错,如下: [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Productio ...

  5. java对String进行sha1加密

    1.使用apache的codec jar包对string进行加密,先下载并引入jar包: http://commons.apache.org/proper/commons-codec/ 2.生成: S ...

  6. windows修改Host后未生效。

    打开CMD命令,输入ipconfig /flushdns即可

  7. iOS开发之数据存储之Core Data

    1.概述 Core Data框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,不需要 ...

  8. Java 异常处理 try catch finally throws throw 的使用和解读(一)

    //最近的一个内部表决系统开发过程中,//发现对异常处理还存在一些模棱两可的地方,//所以想着整理一下//主要涉及到://1.try catch finally throws throw 的使用和解读 ...

  9. build.gradle代码

    Android Studio 这么强大的工具,就算我们不懂 gradle, groovy, 也照样能借助AS对 Android 项目进行编译.调试.运行.打包等操作.build.gradle 这个文件 ...

  10. python3基础之整数常用的方法整理

    希望对大家学习或者使用python3能具有一定的参考价值. __abs__     #返回一个数的绝对值 >>> num3=-22 >>> num3.__abs__ ...