为什么80%的码农都做不了架构师?>>>   

在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 Test {
        public static void main(String[] args) {
                try {
                        System.out.println(args[0]);
                        System.out.println("I'm nomal");
                } catch (Exception ex) {
                        System.out.println("I'm exception");
                } finally {
                        System.out.println("I'm finally.");
                }
        }
}
运行这段代码,很明显,不论是否有参考输入,"I'm finally."这句话都会打印出来。这是最常用的写法,很显然与Tutorial中的说明是相符的。

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

我们将代码稍做修改:

public class Test {
        public static void main(String[] args) {
                try {
                        System.out.println(args[0]);
                        System.out.println("I'm nomal");
                        return;
                } catch (Exception ex) {
                        System.out.println("I'm exception");
                        return;
                } finally {
                        System.out.println("I'm finally.");
                }
        }
}
 代码的修改很简单,只是在try和catch块的结束位置分别加了一个return语句。

这样运行结果是什么呢?可能会有两种猜想了,或是直接退出,或是仍会打印"I'm finally."。验证真理的方法是实践,我们运行这段代码,看一下结果:

>java Test
I'm exception
I'm finally.
>java Test hello
hello
I'm nomal
I'm finally.

上面分别是输入和不输入参数时运行的结果,很明显,finally中的代码还是执行了。那是不是说try和catch块中的return语句并不起作用吗?我们再次简单修改代码:
public class Test {
        public static void main(String[] args) {
                try {
                        System.out.println(args[0]);
                        System.out.println("I'm nomal");
                        return;
                } catch (Exception ex) {
                        System.out.println("I'm exception");
                        return;
                } finally {
                        System.out.println("I'm finally.");
                }
                System.out.println("Out of try.");
        }
}
在try语句外面再加入一名打印代码,再次编译。

编译错误,结果如下:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
        Unreachable code

提示代码不可达,看来return还是有用的,只是在退出方法呼叫之前,会先去执行finally中的代码。

现在似乎说明了另外一个问题,是不是return语句还不够厉害,“让暴风雨来的更猛烈些吧”,我们再次修改代码,将return语句修改成System.exit(),看一下执行结果。

public class Test {
        public static void main(String[] args) {
                try {
                        System.out.println(args[0]);
                        System.out.println("I'm nomal");
                        System.exit(0);
                } catch (Exception ex) {
                        System.out.println("I'm exception");
                        System.exit(0);
                } finally {
                        System.out.println("I'm finally.");
                }
        }
}
运行代码,终于,"I'm finally."不见了。

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

下面是我们的结论:
   在不终止VM的情况下,finally中的代码一定会执行。

转载于:https://my.oschina.net/MiniBu/blog/338123

finally块中的代码一定会执行吗?相关推荐

  1. java fianlly_Java冷知识:finally中的代码一定会执行吗?

    前言 Java开发中,正常情况下,在执行了try代码块之后,finally中的代码一定会执行.我们实际开发也经常会利用这个特性,在finally中来执行一些特殊的操作,比如:释放资源.释放锁等. de ...

  2. finally块中的代码什么时候被执行?finally是不是一定会被执行?(见最后引申)

    问题描述:try{}里有一个return语句,那么紧跟在这个try{}后面的finally{}中的代码是否会被执行?如果会的话,什么时候被执行,在return之前还是return之后? 在Java语言 ...

  3. python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...

    3. (2019高一下·浙江期末) 数制转换.将一个K进制(k<=10)数x转换成十进制数可采用如下方法:主要方法是从右向左,依次取数x的各位数字,分别计算出该数从右边数起的第i位数字与k(i- ...

  4. {转载}java Finally块中代码什么时候执行

    转载自:https://blog.csdn.net/Dove_Knowledge/article/details/71077512 原创作者:Yes_JiangShuai 问题描述:try{}里有一个 ...

  5. Java 中 finally 与 return 的执行顺序详解

    java方法是在栈幀中执行,栈幀是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间,栈幀分为三个区域: 1 . 操作数栈,用来保存正在执行的表达式中的操作数, ...

  6. 有return的时候,finally块中代码还会执行吗

    1 背景 当然是面试被问到了.... 2 记录一下 这篇文章主要讲解两个问题: 在try中有return或者catch中有return的时候,finally中的代码是否会执行? 如果会被执行,是在什么 ...

  7. Java 中静态代码块 static的作用及用法

    java静态代码块的作用: Java静态代码块中的代码会在类加载JVM时运行,且只被执行一次,也就是说这些代码不需要实例化类就能够被调用.一般情况下,如果有些代码必须在项目启动的时候就执行的时候,就需 ...

  8. Static静态代码块以及各代码块之间的执行顺序

    前言 在Java中,Static静态代码块.构造代码块.普通代码块.构造函数的执行顺序是一个java学习者必须掌握的基础,本篇博客旨在让大家能清除了解它们之间的执行顺序. 文章目录 代码块的分类 1. ...

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

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

最新文章

  1. NVIDIA GPUs上深度学习推荐模型的优化
  2. activity使用dialog主题
  3. Eclipse 高亮显示选中的相同变量
  4. 基于随机森林的分类与回归
  5. 百度愚人节恶搞背后的趋势
  6. SSH框架电子商城-系统技术分析
  7. 扫描线填充算法代码_手写算法并记住它:计数排序
  8. flash实用工具类+开源包收藏
  9. 如何在几秒钟内退出所有 Mac 应用程序?
  10. element表格里面放图片_使用 VUE 把你的数据导出成 Excel 表格
  11. paip.图片搜索工具总结
  12. 爬取行政区划(改版)
  13. 修图类APP原型设计分享– Hello Camera
  14. Win10环境下安装VS2010旗舰版 和安装Visual Assist10.9.2108.0
  15. Teams App自定义
  16. [置顶] Android九环刀之RatingBar之评委请亮分
  17. 可鸡的三大充要条件来了!!
  18. 【Python】两种方法计算平均值、中值、众数、方差、标准差、百分位数
  19. 越来越卷,教你使用Python实现卷积神经网络(CNN)
  20. u盘怎么样在w ndows7上使用,用U盘给MAC BOOK AIR安装windows7系统

热门文章

  1. 开源 软件测试自动化工具,开源Web自动化测试工具Selenium IDE
  2. matlab-创建函数
  3. dump mysql_mysql/mariadb知识点总结(28):mysql备份工具之mysqldump
  4. FPGA之道(20)FPGA设计的上板调试与项目总结
  5. [tomcat]源码简析 异步/非阻塞和请求构成
  6. java频繁的new对象 优化方案
  7. EOS开发工具Visual-studio-code和CLion设置
  8. 基于MSM 的tomcat session 共享
  9. 源码安装vsftp3.0.3
  10. vue 数组赋值_如何给Vue的data中的数组赋值?