前言

Java开发中,正常情况下,在执行了try代码块之后,finally中的代码一定会执行。我们实际开发也经常会利用这个特性,在finally中来执行一些特殊的操作,比如:释放资源、释放锁等。

demo

public class Finally {

public static void main(String[] args) {

try {

//正常业务逻辑

System.out.println("I am try");

throw new RuntimeException("I am RuntimeExecption");

} catch (Exception e) {

//异常处理

System.out.println("I am Exception -> " + e.getMessage());

} finally {

//释放资源等

System.out.println("I am Finally");

}

}

}

execute

I am try

I am Exception -> I am RuntimeExecption

I am Finally

那么是不是finally中的代码一定会被执行呢?

其实不然,目前作者了解到有两种情况下,finally中的代码不会被执行(不考虑try之前出现异常或者return的情况,换言之,在try之前出现异常或者return时,try对应的finally中的内容不会被执行)

finally之前虚拟机被停止

demo

public class Finally {

public static void main(String[] args) {

try {

//正常业务逻辑

System.out.println("I am try");

throw new RuntimeException("I am RuntimeExecption");

} catch (Exception e) {

//异常处理

System.out.println("I am Exception -> " + e.getMessage());

System.exit(1);//异常关闭虚拟机

} finally {

//释放资源等

System.out.println("I am Finally");

}

}

}

execute

I am try

I am Exception -> I am RuntimeExecption

上面的代码在出现了异常之后,使用System.exit(1)退出关闭虚拟机,finally中的代码当然无法执行。

守护线程中的finally

demo

public class Finally {

public static void main(String[] args) throws Exception {

Thread thread = new Thread(new Runnable() {

public void run() {

try {

//正常业务逻辑

System.out.println("I am try");

Thread.sleep(1000);

} catch (Exception e) {

//异常处理

System.out.println("I am Exception -> " + e.getMessage());

} finally {

//释放资源等

System.out.println("I am Finally");

}

}

});

thread.setDaemon(true);

thread.start();

Thread.sleep(1000);

System.out.println("end");

}

}

execute

I am try

end

使用setDaemon(true)方法来设置线程为守护线程,从打印结果中可以看到,守护线程中,try代码块中的代码执行了,finally代码块未必执行。主要原因是因为守护线程会随着所有非守护线程的退出而退出。上述在主线程和守护线程中都设置sleep(1000)的原因是怕线程run()方法还未开始执行主线程就退出了,这样的话try代码块中的内容都不会执行。当然不是说守护线程中的finally代码一定不会执行。

总结

java中,如果想要执行try中的代码之后,不允许再执行finally中的代码,有以下两种方式:

使用System.exit(1)来退出虚拟机

把当前执行trycatchfinally代码的线程设置为守护线程

java fianlly_Java冷知识:finally中的代码一定会执行吗?相关推荐

  1. finally块中的代码一定会执行吗?

    为什么80%的码农都做不了架构师?>>>    在Sun Tutorial中有这样一句话:The finally block always executes when the try ...

  2. java类中的static块_java类中static代码块的执行次数

    java类中 static静态代码块的执行次数 1.在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执行,static块只执行一次,由JVM保证其只执行一次. 2.直接看示例 ...

  3. java 父类的构造函数_java中为什么父类构造函数必须执行?

    final 在java中,final可以用来修饰类,方法和变量(成员变量或局部变量).下面将对其详细介绍. 1.1 修饰类 当用final修饰类的时,表明该类不能被其他类所继承.当我们需要让一个类永远 ...

  4. java synthetic_Java冷知识(三)编译器的花招之synthetic

    我们在阅读JDK反射包源码时,会遇到isSynthetic()方法,其实现之一是Modifier.isSynthetic(getModifiers()),其他方式的原理一样.Modifier是专门定义 ...

  5. python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...

    3. (2019高一下·浙江期末) 数制转换.将一个K进制(k<=10)数x转换成十进制数可采用如下方法:主要方法是从右向左,依次取数x的各位数字,分别计算出该数从右边数起的第i位数字与k(i- ...

  6. java代码执行了两次_Java中JComboBox的itemStateChanged事件执行两次的解释

    今天做项目,用到了JComboBox,即下拉列表框.为了在被选中的项发生改变时获得被选中的项,所以使用的ItemStateChanged事件,可是问题就来了,每次触发该事件,它都执行两次,屡试不爽.一 ...

  7. {转载}java Finally块中代码什么时候执行

    转载自:https://blog.csdn.net/Dove_Knowledge/article/details/71077512 原创作者:Yes_JiangShuai 问题描述:try{}里有一个 ...

  8. 此时不应有java_Java 锁的知识总结及实例代码

    这篇文章主要介绍了Java 锁的知识总结及实例代码,需要的朋友可以参考下 java中有哪些锁 在java中锁主要两类:内部锁synchronized和显示锁java.util.concurrent.l ...

  9. Java SE 基础知识(一)

    一.基础知识 1. Java SE : Java Standard Edition Java ME : Java Micro Edition Java EE : Java Enterprise Edi ...

最新文章

  1. R探索新数据分析(Exploratory Data Analysis,EDA)
  2. #求教# 公共less模块中的背景图片地址应该怎么处理?
  3. yml连接sqlserver_springboot配置双数据源 MySQL和SqlServer
  4. 最新C#开源资源项目
  5. 解构华为云HE2E项目中的容器技术应用
  6. HTC S710D(电信版)G11解锁,成功ROOT
  7. 力扣98. 验证二叉搜索树(JavaScript)
  8. 如何在页面显示json数据
  9. cad 万能字体_【干货】CAD实用技巧50条
  10. 计算机网络telnet命令作用,telnet命令使用方法详解
  11. [算法]Fibonacci数列O(n)和O(lgn)的解法
  12. 英文书籍下载网站推荐
  13. poco mysql 库_了解Poco C++ Poco::Data 数据库基本操作
  14. office2010 word 关闭很慢
  15. EasyExcel解析动态表头及导出
  16. 面向对象程序设计(Java) chapter9
  17. java之父那一年出生_黄小戈哪一年出生 起底其详细资料背景曝真实年龄多少
  18. Socket编程入门C++
  19. 图像处理职位面试题汇总(2)
  20. 【深度思维】读书笔记

热门文章

  1. 复杂的1秒 图解Google搜索技术
  2. 如何寻求解脱_在设计中寻求安慰
  3. springboot大学生青年志愿者管理的设计与实现毕业设计源码101605
  4. YGG:2021年年终回顾
  5. 想要用电脑玩游戏,好的显示器必不可少!电脑显示器要怎么选?
  6. 鸢尾花决策树分类及可视化
  7. iOS UIFont 字体名字大全
  8. 大论文 自动生成标题目录、图目录和表目录
  9. 怎么用免费视频引流?如何利用视频网站免费引流?
  10. linux查询进程号是否存在启动脚本,Shell实现判断进程是否存在并重新启动脚本分享...