java fianlly_Java冷知识:finally中的代码一定会执行吗?
前言
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中的代码一定会执行吗?相关推荐
- finally块中的代码一定会执行吗?
为什么80%的码农都做不了架构师?>>> 在Sun Tutorial中有这样一句话:The finally block always executes when the try ...
- java类中的static块_java类中static代码块的执行次数
java类中 static静态代码块的执行次数 1.在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执行,static块只执行一次,由JVM保证其只执行一次. 2.直接看示例 ...
- java 父类的构造函数_java中为什么父类构造函数必须执行?
final 在java中,final可以用来修饰类,方法和变量(成员变量或局部变量).下面将对其详细介绍. 1.1 修饰类 当用final修饰类的时,表明该类不能被其他类所继承.当我们需要让一个类永远 ...
- java synthetic_Java冷知识(三)编译器的花招之synthetic
我们在阅读JDK反射包源码时,会遇到isSynthetic()方法,其实现之一是Modifier.isSynthetic(getModifiers()),其他方式的原理一样.Modifier是专门定义 ...
- python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...
3. (2019高一下·浙江期末) 数制转换.将一个K进制(k<=10)数x转换成十进制数可采用如下方法:主要方法是从右向左,依次取数x的各位数字,分别计算出该数从右边数起的第i位数字与k(i- ...
- java代码执行了两次_Java中JComboBox的itemStateChanged事件执行两次的解释
今天做项目,用到了JComboBox,即下拉列表框.为了在被选中的项发生改变时获得被选中的项,所以使用的ItemStateChanged事件,可是问题就来了,每次触发该事件,它都执行两次,屡试不爽.一 ...
- {转载}java Finally块中代码什么时候执行
转载自:https://blog.csdn.net/Dove_Knowledge/article/details/71077512 原创作者:Yes_JiangShuai 问题描述:try{}里有一个 ...
- 此时不应有java_Java 锁的知识总结及实例代码
这篇文章主要介绍了Java 锁的知识总结及实例代码,需要的朋友可以参考下 java中有哪些锁 在java中锁主要两类:内部锁synchronized和显示锁java.util.concurrent.l ...
- Java SE 基础知识(一)
一.基础知识 1. Java SE : Java Standard Edition Java ME : Java Micro Edition Java EE : Java Enterprise Edi ...
最新文章
- R探索新数据分析(Exploratory Data Analysis,EDA)
- #求教# 公共less模块中的背景图片地址应该怎么处理?
- yml连接sqlserver_springboot配置双数据源 MySQL和SqlServer
- 最新C#开源资源项目
- 解构华为云HE2E项目中的容器技术应用
- HTC S710D(电信版)G11解锁,成功ROOT
- 力扣98. 验证二叉搜索树(JavaScript)
- 如何在页面显示json数据
- cad 万能字体_【干货】CAD实用技巧50条
- 计算机网络telnet命令作用,telnet命令使用方法详解
- [算法]Fibonacci数列O(n)和O(lgn)的解法
- 英文书籍下载网站推荐
- poco mysql 库_了解Poco C++ Poco::Data 数据库基本操作
- office2010 word 关闭很慢
- EasyExcel解析动态表头及导出
- 面向对象程序设计(Java) chapter9
- java之父那一年出生_黄小戈哪一年出生 起底其详细资料背景曝真实年龄多少
- Socket编程入门C++
- 图像处理职位面试题汇总(2)
- 【深度思维】读书笔记