Finally语句块的运行
一、finally语句块是否一定运行?
Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被运行?非常多人都说不是。当然他们的回答是正确的,经过试验。至少下面有两种情况下finally语句是不会被运行的:
(1)异常捕获机制finally块与try和catch块是关联的。既然是关联的假设try...catch...finally语句逻辑上达不到没有被运行,如在try语句之前就返回了,这样finally语句就不会运行,这也说明了finally语句被运行的必要而非充分条件是:对应的try...catch...finally语句一定被运行到。
(2)在try块中有System.exit(0);这种语句,System.exit(0);是终止Java虚拟机JVM的。连JVM都停止了。所以都结束了,当然finally语句也不会被运行到。
二、finally语句块是否一定会运行,遇到return怎么办?
public class FinallyTest1 {public void test(){try{System.out.println("Try statement block……");return ;}catch(Exception e){System.out.println("Exception statement block……");}finally{System.out.println("在try语句块中return你再强大,也影响不了我finally语句块的继续运行,嘿嘿……");}}public static void main(String[] args) {FinallyTest1 t=new FinallyTest1();t.test();}
}/*运行结果:Try statement block……在try语句块中return你再强大,也影响不了我finally语句块的继续运行,嘿嘿……总结:finally语句块的运行不会受到try语句块中的return的影响。
*/
三、finally语句块不受return语句的影响。哪finally语句块究竟是在return之前还是之后运行?
public class FinallyTest2 {private int test(){ int a=520;try{return a+=1314000;}catch(Exception e){System.out.println();}finally{System.out.println("Finally运行,a值为:"+a);a=0;System.out.println("小闹了一下(a=0),嘿嘿!
"); } return 250; } public static void main(String[] args) { FinallyTest2 t=new FinallyTest2(); System.out.println("方法返回(return) :"+t.test()); } } /* 运行结果: Finally运行,a值为:1314520 小闹一下(a=0),嘿嘿。 方法返回(return) :1314520 总结: 在try语句块中运行到了return时,并非马上返回而是把return要返回的值计算出来先保存到内存中, 然后去运行finally语句块。然后再返回之前保存要return的值。
*/
四、在返回之前运行在finally块中的语句,哪finally块中也return会怎么样呢?
public class FinallyTest3 {//@SuppressWarnings 批注同意您选择性地取消特定代码段(即,类或方法)中的警告。@SuppressWarnings("finally") private int test(){ try{return 520;}catch(Exception e){System.out.println();}finally{return 5820; //此处return语句会产生警告}}public static void main(String[] args) {FinallyTest3 t=new FinallyTest3();System.out.println("方法返回(return) :"+t.test());}
}
/*
执行结果:方法返回(return) :5820总结:假设try和finally都有return 语句。则返回值以最后一个return语句的值作为返回,前面的一个被默认的牺牲啦。
*/
Finally语句块的运行相关推荐
- java多层catch语句_Java异常之catch语句块
今天在阅读项目代码时看到如下奇怪的代码,以为是竖线 | 可以作为多类型赋值,经过网上搜索才知道是Java SE 7新增的功能:一个catch捕获多种类型的异常.原文是Java官方的文档,现翻译如下.红 ...
- python使用什么来表示不同级别的语句块-Python
[简答题] [简答题]请写出下列程序的运行结果: def add_b(): global b b = 42 def do_global(): #global b b = b + 10 print(b) ...
- 关于 Java 中 finally 语句块的深度辨析
可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...
- python语言句块的标记_Python语言语句块的标记是()
[简答题] [单选题]Listen( 1.1-1) and answer: Karen Wood is ___________. [单选题]下列说法正确的是 ( ). [判断题]旅游的实质实人类追求自 ...
- Finally语句块的执行
一.finally语句块是否一定执行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过试验,至 ...
- C++primer 第 5 章语句 5.2语句作用域 5.3条件语句 5 . 4 迭代语句 5.5跳转语句 5.6 try语句块和异常处理
5 . 1 简单语句 C++语言中的大多数语句都以分号结束,一个表达式,比如ival + 5 , 末尾加上分号就变成了表达式语句(expression statement).表达式语句的作用是执行表达 ...
- switch()语句块的出口:break;
switch()语句块里的case:相当于一个开关,只要满足case的条件,开关就打开,从而执行case语句块的内容,而break就相当于一个出口,只要碰到了break,就跳出switch语句块,否则 ...
- [转载] java synchronized静态同步方法与非静态同步方法,同步语句块
参考链接: Java中的静态方法与实例方法 java synchronized静态同步方法与非静态同步方法,同步语句块 并发编程 线程同步 静态方法锁 非静态方法锁 同步块 进行多线程编程,同步控制是 ...
- eclipse折叠if语句块_「03」java中的方法以及控制语句
语句块(有时叫做复合语句),是用花括号扩起的任意数量的简单Java语句.块确定了局部变量的作用域.块中的程序代码,作为一个整体,是要被一起执行的.块可以被嵌套在另一个块中,但是不能在两个嵌套的块内声明 ...
最新文章
- photoshop CS不能打字,出现死机等现象的解决办法!!
- 学术写作强力推荐语法检查神器:marking mate
- .net面试题大全,绝大部分面试题
- DOCKER windows 安装Tomcat内容
- 数据库设计器无法打开方法
- 解决df -h卡死问题
- 《C语言解惑》—— 2.1 printf输出的小奥妙
- android 打好的补丁位置,Android 6.0上打完第一个补丁后再打新补丁Crash
- IEC 60601-1-2020 最新英文-医疗电气设备--第1部分 基本安全性及性能的一般要求
- 英语学习/词典App分析-团队作业(五)
- Python自动化测试框架有哪些?(总结几种)
- 广电物联网大赛正式开启
- python输出26个大小写字母_python实现生成字符串大小写字母和数字的各种组合
- 飞腾服务器通过KunLun BIOS 对JBOD模式的系统盘进行格式化,删除系统盘中残留数据的操作方法
- 创芯科技-CAN收发器使用
- 网络舆情分析关键词怎么获取的系统平台方法
- wiondows如何更新pip版本
- 教你快速配置wordpress由http变成https访问
- 本科行政管理毕业论文什么题目好写点?
- [转]火爆背后的挑战:直播平台的高并发架构设计