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 于 finally 深度分析语句块
首先,让我们来问你一个问题:finally 声明块将运行? 很多人认为 finally 语句块是一定要运行.其中还包括了一些非常有经验的 Java 程序猿.不幸的是,没有像很多像人们想象,对于这个问题 ...
- 【转】linux下使用sqlplus执行包含语句块的sql文件,运行时会不断显示行号,而在plsqldev中能执行
一.数据库:Oracle数据库 二.sql文件内容: --创建函数 CREATE OR REPLACE function fun_createuid1 return varchar2 is Resul ...
- .NET基础 一步步 一幕幕[循环、逻辑语句块]
循环.逻辑语句块 好久不写博客了,断更了好几天了,从上周五到今天,从北京到上海,跨越了1213.0公里,从一个熟悉的城市到陌生的城市,还好本人适应力比较好,还有感谢小伙伴的接风咯,一切都不是事,好 ...
- java synchronized静态同步方法与非静态同步方法,同步语句块
摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...
- java面向对象值类属语句块
在我们之前学习语句的时候,我们讲过一种比较特殊的语句块,那就是局部代码块.局部代码块的作用是什么呢,就是把临时使用的变量放在里面,之后执行完之后,局部代码块中定义的变量会直接被释放,这样就避免了那些我 ...
- synchronized同步语句块
用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待比较长时间.在这样的情况下可以使用synchronized同步语句块来解 ...
- static语句块的执行时间
package utfTest; public class Test01 { public static void main(String[] args) { //Person.show(); Sys ...
- Java中关于static语句块的理解
Java中关于static语句块的理解 一.static块会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法. 实例一 public class A{ String name ...
- Try-Catch-Finally语句块执行问题
Try-Catch-Finally语句块执行问题 记录一个今天某公司的面试问题,其实我问题回答对了,但是面试官问我动手验证过没有,这还真没有,纯理论,被怼惨了,希望自己能变得更强大. Try-Catc ...
随机推荐
- POJ 1056 IMMEDIATE DECODABILITY
IMMEDIATE DECODABILITY Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9630 Accepted: ...
- vscode & code snippets
code snippets vscode & code snippets https://github.com/xgqfrms/FEIQA/tree/master/000-xyz/templa ...
- 算法复习——半平面交(bzoj2618凸多边形)
讲解: 这里套用wuvin神犇的ppt,附上友情链接:http://blog.leanote.com/wuvin 半平面交: 算法流程: 注意事项: 例题: Description 逆时针给出n个凸多 ...
- 家用电脑架服务器提供web
要搞一个可以对外的web服务,需要服务器,域名.这些都需要money,但有时,我们只是想自己可以在外面访问,或是提供给朋友看自己的网站有多牛.这时使用家用电脑配置一个可以提供web的服务器,就显得很必 ...
- 蜥蜴 BZOJ 1066
蜥蜴 [问题描述] 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距 ...
- Codeforces Round #269 (Div. 2) D - MUH and Cube Walls kmp
D - MUH and Cube Walls Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & % ...
- 标准C程序设计七---05
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- 未能加载文件或程序集“System.EnterpriseServices, Version=4.0.0.0或2.0.0.0
未能加载文件或程序集“System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50 ...
- 【Vue 学习系列 - 01】- 环境搭建(Win7)
1. 根据系统下载Node.js 下载地址:http://nodejs.cn/download 2. 安装Node.js 点击安装Node.js,在安装目录D:\Program Files\nodej ...
- VC++下编译Libgeotiff(含Libtiff)
转自原文Win10+VC++下编译Libgeotiff(含Libtiff)详细图文教程 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作GeoTiff文件的库.同 ...