一、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语句块的运行的更多相关文章

  1. 左右 Java 于 finally 深度分析语句块

    首先,让我们来问你一个问题:finally 声明块将运行? 很多人认为 finally 语句块是一定要运行.其中还包括了一些非常有经验的 Java 程序猿.不幸的是,没有像很多像人们想象,对于这个问题 ...

  2. 【转】linux下使用sqlplus执行包含语句块的sql文件,运行时会不断显示行号,而在plsqldev中能执行

    一.数据库:Oracle数据库 二.sql文件内容: --创建函数 CREATE OR REPLACE function fun_createuid1 return varchar2 is Resul ...

  3. .NET基础 一步步 一幕幕[循环、逻辑语句块]

    循环.逻辑语句块   好久不写博客了,断更了好几天了,从上周五到今天,从北京到上海,跨越了1213.0公里,从一个熟悉的城市到陌生的城市,还好本人适应力比较好,还有感谢小伙伴的接风咯,一切都不是事,好 ...

  4. java synchronized静态同步方法与非静态同步方法,同步语句块

    摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...

  5. java面向对象值类属语句块

    在我们之前学习语句的时候,我们讲过一种比较特殊的语句块,那就是局部代码块.局部代码块的作用是什么呢,就是把临时使用的变量放在里面,之后执行完之后,局部代码块中定义的变量会直接被释放,这样就避免了那些我 ...

  6. synchronized同步语句块

    用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待比较长时间.在这样的情况下可以使用synchronized同步语句块来解 ...

  7. static语句块的执行时间

    package utfTest; public class Test01 { public static void main(String[] args) { //Person.show(); Sys ...

  8. Java中关于static语句块的理解

    Java中关于static语句块的理解 一.static块会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法. 实例一 public class A{ String name ...

  9. Try-Catch-Finally语句块执行问题

    Try-Catch-Finally语句块执行问题 记录一个今天某公司的面试问题,其实我问题回答对了,但是面试官问我动手验证过没有,这还真没有,纯理论,被怼惨了,希望自己能变得更强大. Try-Catc ...

随机推荐

  1. javascript数组学习1

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. nginx报错504

    Nginx 504错误(Gateway time-out  网关超时)的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 一般看来, 这种情况可能是由于nginx默认的f ...

  3. 【leetcode 字符串】466. Count The Repetitions

    https://leetcode.com/problems/count-the-repetitions/description/ 找循环节 https://www.cnblogs.com/grandy ...

  4. cf287E Main Sequence

    As you know, Vova has recently become a new shaman in the city of Ultima Thule. So, he has received ...

  5. Python入门--8--现在需要先学习可视化--包:easygui

    一.安装.了解easygui 下载地址:http://bbs.fishc.com/forum.php?mod=viewthread&tid=46069&extra=page%3D1%2 ...

  6. linux top %VSZ含义

    https://blog.csdn.net/sinohenu/article/details/58216013 https://unix.stackexchange.com/questions/449 ...

  7. Codeforces 518 D Ilya and Escalator

    Discription Ilya got tired of sports programming, left university and got a job in the subway. He wa ...

  8. Leetcode 数组问题2:买卖股票的最佳时机 II

    问题描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易( ...

  9. synchronized初识

    作用域: 1.对象实例内--->People jack = new Jack(); ①此作用域内的synchronized锁 ,可以防止多个线程同时访问这个对象的synchronized方法 ② ...

  10. http://www.yiibai.com/java8/java8_temporaladjusters.html

    原文:http://www.yiibai.com/java8/java8_temporaladjusters.html TemporalAdjuster 是做日期数学计算.例如,要获得“本月第二个星期 ...