在Sun Tutorial中有这样一句话:The finally block always executes when the try block exits. This ensures that the finally block is executed even if an unexpected exception occurs.  看来finally块中的语句应该是总会执行的。

先来写一个最常见的写法:

 public class finally_test {

     public static void main(String[] args){
try{
System.out.println("11");
//System.out.println(args[0]);
System.out.println("nomal");
}catch(Exception e){
System.out.println("exception");
}finally{
System.out.println("finally");
}
}
}

执行结果:

11
nomal
finally

System.out.println("11");换成 System.out.println(args[0]);
无输入的情况下:
执行结果:

exception
finally

运行这段代码,很明显,不论是否有参考输入,"I'm finally."这句话都会打印出来。这是最常用的写法,很显然与Tutorial中的说明是相符的。

下面我们再进一步想一下,假如在try或是catch块中使用了return语句,那么会怎么样呢?

我们将代码稍做修改:

 public class finally_test {

     public static void main(String[] args){
try{
System.out.println("11");
System.out.println(args[0]);
System.out.println("nomal");
return;
}catch(Exception e){
System.out.println("exception");
return;
}finally{
System.out.println("finally");
}
}
}

执行结果:

11
exception
finally

很明显,finally中的代码还是执行了。再次修改代码,将return语句修改成System.exit(),看一下执行结果。

 public class finally_test {

     public static void main(String[] args){
try{
System.out.println("11");
System.out.println("nomal");
System.exit(0);
}catch(Exception e){
System.out.println("exception");
System.exit(0);
}finally{
System.out.println("finally");
}
}
}

执行结果:

11
nomal

运行代码,终于,"I'm finally."不见了。

为什么System.exit()有这么强大的力量呢,让我们看一下API中的说明:exit(int status): Terminates the currently running Java Virtual Machine。原来是这样,JVM都被终止掉了,当然不会再执行finally中的语句了。

下面是我们的结论:

在不终止VM的情况下,finally中的代码一定会执行。


参考:

1.Java牛角尖【013】: finally块中的代码一定会执行吗?

2.

finally块中的代码一定会执行吗?的更多相关文章

  1. finally语句块一定会执行吗?

    public class SystemExitAndFinally { public static void main(String[] args) { try{ System.out.println ...

  2. java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?

    在Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity.所有对象的非同步方法都能够在任意时刻被任意线程调用 ...

  3. try catch finally语句块中存在return语句时的执行情况剖析

    2种场景 (1) try中有return,finally中没有return(注意会改变返回值的情形);(2) try中有return,finally中有return; 场景代码分析(idea亲测) 场 ...

  4. java中静态代码块详解

    感谢大佬:https://blog.csdn.net/qq_35868412/article/details/89360250 今天在项目中看到这行代码,静态代码块,很久没用静态代码块了,今天来复习一 ...

  5. 当try、catch中有return时,finally中的代码会执行么?

    今天,看到一个面试题: try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 我们用代码来验证下: public static void mai ...

  6. JavaScript中的代码执行顺序

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head&g ...

  7. try...cath...finally中的return什么时候执行

    一finally可以没有,也可以只有一个.无论有没有发生异常,它总会在这个异常处理结构的最后运行.即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常 ...

  8. Java中try catch finally语句中含return语句的执行情况总结-编程陷阱

    前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...

  9. java中return与finally的执行顺序

    可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...

随机推荐

  1. ctDNA 相关网站-liquid-biopsy

    http://www.gene-quantification.de/liquid-biopsy.html Liquid Biopsy -- Definitions Liquid Biopsy -- r ...

  2. 个人博客 week1

    1:看完教材后不懂的几个问题: (1):团队合作中每个人分工而行,如何保证比较完善的各人之间的信息共享? (2):敏捷开发如何保证开发的效率?即在进行大项目的开发时敏捷开发看上去会很混乱. (3):黑 ...

  3. ZOJ-3725 Painting Storages 动态规划

    题意:给定一个数N,表示有N个位置,要么放置0,要么放置1,问至少存在一个连续的M个1的放置方式有多少? 分析:正面求解可能还要考虑到重复计算带来的影响,该题适应反面求解.设dp[i][j]表示到前 ...

  4. javascript中获取非行间样式的方法

    我们都知道一般在javascript中获取样式一般用的是nodeObj.style.attr这个属性的,但是这个属性只能获取行间样式非行间样式比如写在样式表中的样式那么用nodeObj.style.a ...

  5. 流媒体基础实践之——RTMP和HLS分发服务器nginx.conmf配置文件(解决了,只能播放RTMP流而不能够播放HLS流的原因)

    user www www; worker_processes ; error_log logs/error.log debug; #pid logs/nginx.pid; events { worke ...

  6. postgresql如何实现group_concat功能

    MySQL有个聚集函数group_concat, 它可以按group的id,将字段串联起来,如 表:id name---------------1 A2 B1 B SELECT id, group_c ...

  7. 教你如何精通Struts:Tiles框架

    Tiles框架特性和内容 Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离.它允许先创建模板,然后在运行时动态地将内容插入到模板中.Tiles 框架建立在JSP的inclu ...

  8. lmdb存储的一些库相关函数

    MDB_env 为一个结构体,Opaque structure for a database environment. MDB_txn :Opaque structure for a transact ...

  9. Java编程思想学习笔记_5(IO流)

    一.用DataInputStream读取字符 可以使用available方法查看还有多少可供存取的字符.示例如下: public class Test1 { public static void ma ...

  10. Spring Boot修改内置Tomcat端口号 (zhuan)

    http://blog.csdn.net/argel_lj/article/details/49851625 ********************************************* ...