finally块不被执行的情况总结

finally块的作用

通常用于处理善后工作。当try块里出现异常时,会立即跳出try块,到catch块匹配对应的异常,执行catch块里的语句。此时,可能在try块里存在打开的文件没关闭,连接的网络没断开,这部分资源是GC所不能自动处理的,所以finally的作用就是将它们及时释放回收。

finally块不被执行的情况,总共有3种:不进入try块、程序中止、线程中止(带finally块的是守护线程,其非守护线程都执行完毕)。

1. 未执行try块

对于try-catch-finally或者try-finally,如果不能进入try块,则finally块也无法进入。

public class Test {public static void main(String[] args) {boolean flag = false;if(flag) {try {System.out.println("enter try block");} finally {System.out.println("enter finally block");}}}
}/******************控制台无输出*******************/

2. System.exit()

public class Test {public static void main(String[] args) {try {System.out.println("enter try block");System.exit();} finally {System.out.println("enter finally block");}}
}
/*****************
控制台打印如下
enter try block
******************/

3. try块陷入无限循环

public class Test {public static void main(String[] args) {try {while(true){System.out.println("enter try block");}} finally {System.out.println("enter finally block");}}
}
/*****************完蛋*****************/

4. 守护(daemon)线程被中止时

Java线程分为两类,守护线程和非守护线程。当所有的非守护线程都终止时,无论守护线程存不存在,虚拟机都会kill掉所有的守护线程从而中止程序。

虚拟机中,执行main方法的线程就是一个非守护线程,垃圾回收则是另一个守护线程,main执行完,则程序中止,而不管垃圾回收线程是否中止。

所以,如果守护线程中存在finally代码块,那么当所有的非守护线程中止时,守护线程被kill掉,其finally代码块是不会执行的。

public class Test {public static void main(String[] args) {//main是一个非守护线程Thread thread = new Thread(new Task());thread.setDaemon(true); //设置thread为守护线程thread.start();TimeUnit.SECONDS.sleep(5); //阻塞5s.}
}
class Task implements Runnable {@Overridepublic void run() {System.out.println("enter run()");try {System.out.println("enter try block");} catch(InterruptedException e) {System.out.println("enter catch block");} finally {System.out.println("enter finally block");}}
}
/*******************
控制台打印如下
enter run()
enter try block
enter try finally block
********************/

上述代码,语句 TimeUnit.SECONDS.sleep(5); 会使main线程阻塞5秒,足够线程thread执行。

如果将该语句注释,非守护线程main线程执行完 thread.start(); 这行后,存在三种情况:①CPU时间片还是交给main线程,则非守护线程执行完毕,守护线程thread就会被终止,finally块不执行;②CPU时间片交给thread线程,但是thread线程刚执行完try块,就得交付时间片给main,main已经无语句执行,就会结束,导致守护线程thread也要结束,finally块不执行;③CPU时间片交付thread线程,thread线程完全执行,finally块被执行。

其他迷惑性选项

(1)当try块里面包含有break,该次try块结束后,finally块也会执行。

public class Test {public static void main(String[] args) {for (int i = 0; i < 5; i++) {try {if (i == 2) {break;}} finally {System.out.print(i);}}}
}/*************输出结果:012
**************/

(2)当try块里面包含有return,该次try块结束后,finally块也会执行。

public class Test {public static void main(String[] args) {for (int i = 0; i < 5; i++) {try {if (i == 2) {return;}} finally {System.out.print(i);}}}
}/*************输出结果:012
**************/

(3)当try块里面包含有continue,该次try块结束后,finally块也会执行。

public class Test {public static void main(String[] args) {for (int i = 0; i < 5; i++) {try {if (i == 2) {continue;}} finally {System.out.print(i);}}}
}/*************输出结果:01234
**************/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rabbitmq生产者基于事务实现发送确认

【README】 业务场景&#xff1a; 业务处理伴随消息的发送&#xff0c;业务处理失败&#xff08;事务回滚&#xff09;后要求消息不发送。 补充1&#xff1a;ACK与CONFIRM的区别 ACK-消费者消费成功后确认&#xff1b;&#xff08;消费者确认已收到&#xff09; CONFIRM-事…

什么是CAP定理

转载自 什么是CAP定理计算机界有很多高大上又难于理解的术语&#xff0c;CAP就是其中之一&#xff0c; 什么一致性&#xff08;Consistency&#xff09;&#xff0c; 可用性&#xff08;Availability&#xff09;&#xff0c; 分区容错性&#xff08;Partition tolerance&#…

python找不到指定的文件夹里_Python环球网在Unix中的指定文件路径中找不到*.txt

我在Windows环境中写了一些文件&#xff0c;我在转换文件时遇到了麻烦。在Windows中&#xff0c;我通常使用类似以下内容读取目录中的所有.txt文件&#xff1a;pathtotxt "C:\\Text Data\\EJC\\Philosophical Transactions 1665-1678\\*\\*.txt" for file in glob.g…

从开发者角度谈Mysql主键

转载自 从开发者角度谈Mysql主键说在前面零度mysql一直比较薄弱&#xff0c;俗话说的好&#xff0c;不会mysql的程序员不是好程序员&#xff0c;刚刚好认识mysql大牛刘龘刘&#xff0c;刚刚好就有了这些文章&#xff0c;主要是刘龘刘大牛写的&#xff0c;零度稍微修改成文&…

JVM内存结构分析:为什么需要S0和S1?

一、为什么会有年轻代 我们先来屡屡&#xff0c;为什么需要把堆分代&#xff1f;不分代不能完成他所做的事情么&#xff1f;其实不分代完全可以&#xff0c;分代的唯一理由就是优化GC性能。你先想想&#xff0c;如果没有分代&#xff0c;那我们所有的对象都在一块&#xff0c;…

rabbitmq-消息追踪rabbitmq_tracing

【README】 消息中心的消息追踪需要使用 Trace 实现&#xff0c;Trace是 rabbitmq用于记录每一次发送的消息&#xff1b;方便开发者调试&#xff0c;排错。可通过插件形式提供可视化界面。 【1】 开启消息追踪 1&#xff09;消息追踪通过 rabbitmq的插件 trace 来实现&#x…

python大神交流网站_学习Python必去的8个网站

作为一个现时代的程序员初学者&#xff0c;除了看书之外&#xff0c;互联网的学习手段也是断不能少的&#xff01; 以下这些网站&#xff0c;虽说不上全方位的满足你的需求&#xff0c;但是大部分也都能&#xff01; 0.国外的大神GitHub &#xff1a; https://github.com/pypa/…

一文理清Http2.0

前言 HTTP2.0主要有三大特性&#xff1a;二进制协议、头部压缩、服务端推送&#xff08;Server Push&#xff09;、多路复用。本文从分析http1.x存在的问题入手&#xff0c;逐一介绍http2.0的优势。 Http1.x存在的问题 在HTTP1.0下&#xff0c;HTTP1.1非Keep-Alive模式下&am…

收敛和发散思维如何被用作解决问题的手段

转自&#xff1a; https://www.jdon.com/mda/thinking.html 将发散和收敛的思想结合在一起使用时&#xff0c;可以帮助分析人员得出更好的和更有创造性的解决方案。发散性思维是将一个话题分解并产生许多从原始概念中分支出来的想法的过程&#xff0c;而收敛性思维则是集中于少…

关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

前言 如果你以前没有接触过面向对象的编程语言&#xff0c;那你可能需要先了解一些面向对象语言的一些基本特征&#xff0c;在头脑里头形成一个基本的面向对象的概念&#xff0c;这样有助于你更容易的学习Python的面向对象编程。 接下来我们就来了解关于Python面向对象编程的知…

Java开发必会的反编译知识

转载自 Java开发必会的反编译知识 编程语言在介绍编译和反编译之前&#xff0c;我们先来简单介绍下编程语言&#xff08;Programming Language&#xff09;。编程语言&#xff08;Programming Language&#xff09;分为低级语言&#xff08;Low-level Language&#xff09;和高…

happen-before原则的理解

前言 在程序执行时&#xff0c;为了提高性能&#xff0c;编译器和处理器会对指令进行重排序。 为了明确定义多线程场景下重排序的问题&#xff08;可见性、有序性、原子性&#xff09;&#xff0c;Java引入了JMM(Java Memory Model)&#xff0c;也就是Java内存模型。JMM为JAV…

转:RabbitMQ 消息队列特性知多少

转自&#xff1a; https://www.jianshu.com/p/94d6d5d98c3d 序言 现在我们每天都要与信息打交道&#xff0c;主动或被动的在创造或接收消息。你会收到话费通知短信&#xff0c;使用微信 QQ跟远在万里的朋友交流&#xff0c;也可能使用钉钉跟同事讨论工作&#xff0c;使用抖音…

easyui根据select下拉框内容更新表单内容_Ant Design 4.0 的一些杂事儿 - Select 篇

前几篇&#xff1a;Ant Design 4.0 的一些杂事儿 - Table 篇Ant Design 4.0 的一些杂事儿 - Form 篇聊完了 Table 和 Form 两个重型组件&#xff0c;我们来继续聊聊看起来不那么重的 Select 组件。它在 Ant Design 4.0 中有哪些变化。如果你读过 《Ant Design 4.0 进行时》&…

避免代码冗余,使用接口和泛型重构Java代码

转载自 避免代码冗余&#xff0c;使用接口和泛型重构Java代码在使用动态语言和.NET工作了若干年后&#xff0c;我又回到老本行–Java开发。在Ruby中&#xff0c;清除代码冗余是非常方便的&#xff0c;而在Java中则需要结合接口和泛型实现类似的功能。 原始代码 以下是这个类中的…

一文理类加载相关知识:类加载器、双亲委派、SPI

思维导图 类加载的时机 类加载的流程 类从被加载到内存中开始&#xff0c;直到被从内存中卸载为止&#xff0c;它的整个生命周期包括&#xff1a;验证、准备、解析、初始化、使用和卸载7 个阶段。 其中验证、准备、解析 3 个部分统称为连接&#xff08;Linking&#xff09; …

可以搜python编程答案的软件_python实现百万答题自动百度搜索答案

用python搭建百万答题、自动百度搜索答案。 使用平台 windows7 python3.6 MIX2手机 代码原理 手机屏幕内容同步到pc端 对问题截图 对截图文字分析 用浏览器自动搜索文本 使用教程 1、使用Airdroid 将手机屏幕显示在电脑屏幕上。也可使用360手机助手实现。不涉及任何代码。实现效…

intellij idea设置主题、字体样式和背景色

转自&#xff1a; https://blog.csdn.net/fanrenxiang/article/details/80598895 点击这里查看 <intellij idea使用教程汇总篇> 引言&#xff1a;所谓工欲善其事必先利其器&#xff0c;idea就是这样的利器&#xff0c;刚装好的intellij idea主题样式是白的&#xff0c;…

MySQL优化(四):count()

count()不同写法的区别 COUNT(字段名)&#xff1a;返回SELECT语句检索的行中值不为NULL的行数 COUNT(1)&#xff1a;表示的是直接查询符合条件的数据库表的行数&#xff08;会包含值为NULL的行数&#xff09;。其中1指的是表中的第一个字段&#xff0c;如有表 table(id, colu…

图像sobel梯度详细计算过程_数字图像处理(第十章)

点、线、边缘检测背景知识。书中主要介绍了图像的一阶导数与二阶导数&#xff0c;这个之前的文章中有过介绍这里在复习一遍。对于函数 ,对于点 在x方向的一阶偏导为&#xff1a;,二阶偏导为&#xff1a;之后书中总结了一阶导与二阶导对于图像求取边缘的结论&#xff1a;孤立点检…