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 ...
随机推荐
- numpy array_split()
numpy.array_split(ary, indices_or_sections, axis=0)[source] Split an array into multiple sub-arrays. ...
- 【Luogu】P2422良好的感觉(单调栈)
题目链接 写代码能力需要极大提升.我在五分钟之内想到了单调栈,然后花了一个小时的时间去看我单调队列为啥写错了…… 首先这题需要转换自己的思维.枚举所有“最小点”,然后看它往左往右最大能扩展多少. 维护 ...
- 算法复习——单调队列(sliding windows,ssoi)
题目: 题目描述 给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端,你只能见到窗口的 K 个整数,每次窗体向右移动一位,如下表:
- 2013年EI收录的中国期刊
ISSN 刊名 0567-7718 Acta Mechanica Sinica 1006-7191 Acta Metallurgica Sinica (English Letters) 0253-48 ...
- Spring-IOC源码解读1-整体设计
1. SpringIOC提供了一个基本的javabean容器,通过IOC模式管理依赖关系,并通过依赖注入和AOP增强了为javabean这样的pojo对象赋予事务管理,生命周期管理等基本功能.2. S ...
- LA 3644 简单并查集
题目大意:有一些简单的化合物,每个化合物由两种元素组成,把这些化合物按顺序装车,若k个化合物正好包含k种元素,那么就会爆炸.避免爆炸,有些化合物就不能装车.求有多少个不能装车. 题目分析:若k个化合物 ...
- Virtualization基础
官方文档学习 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/pdf/Virtualization_G ...
- C# 编程中的堆栈(Stack)和队列(Queue)
一.什么是堆?(Heap) 堆是无序的,是一片不连续的内存域,由用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收. 是程序运行期 ...
- 洛谷 P2613 【模板】有理数取余
P2613 [模板]有理数取余 题目描述 给出一个有理数c=\frac{a}{b}c=ba,求c\ \bmod 19260817c mod19260817的值. 输入输出格式 输入格式: 一共两行. ...
- Flux --> Redux --> Redux React 入门 基础实例使用
本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...