`
liuxinglanyue
  • 浏览: 565195 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
在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块中的语句应该是总会执行的。

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

 
view plaincopy to clipboardprint?
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语句,那么会怎么样呢?

  我们将代码稍做修改:

 
view plaincopy to clipboardprint?
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."。验证真理的方法是实践,我们运行这段代码,看一下结果:

 
view plaincopy to clipboardprint?
>java Test  
I'm exception  
I'm finally.  
  
>java Test hello  
hello  
I'm nomal  
I'm finally.  

  上面分别是输入和不输入参数时运行的结果,很明显,finally中的代码还是执行了。那是不是说try和catch块中的return语句并不起作用吗?我们再次简单修改代码:

 
view plaincopy to clipboardprint?
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语句外面再加入一名打印代码,再次编译。

  编译错误,结果如下:

 
view plaincopy to clipboardprint?
Exception in thread "main" java.lang.Error: Unresolved compilation problem:   
    Unreachable code  

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

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

 
view plaincopy to clipboardprint?
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中的代码一定会执行。
 
分享到:
评论

相关推荐

    行业文档-设计装置-一种打磨成仿牛角尖外形的笔尖.zip

    在本设计装置中,我们探讨了一种创新的工艺方法,用于将笔尖打磨成仿牛角尖的外形。这种设计不仅在视觉上提供了独特的审美体验,还可能改善书写时的手感和性能。以下是对这个技术的详细阐述: 1. 设计理念:仿牛角...

    C++编译的牛角棋

    3. **函数**:C++中的函数是代码块,可以封装一组任务。牛角棋游戏可能包含了多个函数,如初始化棋盘、移动棋子、检查胜利条件、用户输入处理等。每个函数都有特定的职责,通过参数传递信息,并可能返回结果。 4. *...

    牛角包::croissant:轻巧却有用的BukkitSpigotPaper插件库

    牛角包 :croissant: 轻巧却有用的Bukkit / Spigot / Paper插件库。介绍Croissant是一个轻量级的Java库,它为Bukkit / Spigot / Paper插件提供了命令框架和GUI框架。 以下是其功能的简短摘要: 命令框架无需在插件的...

    牛角包:Lu Lua REPL和调试器

    牛角包,一款专为Lua语言设计的交互式REPL(Read-Eval-Print Loop)和调试器,为程序员提供了强大的开发工具,使得在Lua编程过程中能够更加高效、便捷地进行代码测试、调试和学习。本文将深入探讨牛角包的功能特性、...

    电子:中国半导体:牛角峥嵘.pdf

    在深入解读《电子:中国半导体:牛角峥嵘》这篇报告之前,首先要明确几个核心的概念。首先,半导体是指那些在特定温度下导电性能介于导体和绝缘体之间的材料,常被应用于制造各种电子设备的微小组件中,如晶体管、...

    牛角工具箱源码 轻松打造个性化在线工具箱

    下载Release代码 设置运行目录为public 关闭防跨站(open_basedir) 设置伪静态 去除静态文件代理 打开nginx配置 删除图中选中的内容 牛角工具箱源码 轻松打造个性化在线工具箱 安装依赖 full包,已安装依赖,无需...

    OpenOffice 实现JPG.DOC转PDF转SWF在线预览(Java版)

    在IT行业中,转换文档格式是一项常见的任务,尤其在办公自动化和网页预览场景下。本文将详细介绍如何使用OpenOffice在Java环境下实现JPG图片和DOC文档转换为PDF,并进一步将PDF转换为SWF,以便进行在线预览。我们将...

    java注解方式实现拦截接口重复提交

    在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中插入信息的方式,这些信息可以被编译器或运行时环境用来执行特定的动作。在这个场景中,"java注解方式实现拦截接口重复提交"是为了解决一个常见的...

    c# 代码辅助插件 ,功能强大,吐血推荐

    在开发过程中,为了提高效率和代码质量,开发者经常使用代码辅助插件。本文将详细介绍一款名为ReSharper的C#代码辅助插件,它具有诸多强大的功能,被众多开发团队所采用。 ReSharper是JetBrains公司推出的一款高...

    电子:中国半导体:牛角峥嵘.zip

    描述中的“牛角峥嵘”是中国成语,用来形容事物发展势头强劲,暗示中国的半导体产业正展现出强大的竞争力和潜力。尽管没有具体的标签提供额外信息,但我们可以从文件名“电子:中国半导体:牛角峥嵘.pdf”推断,内容...

    原牛角源码(修罗bbs)全站程序打包带数据库备份

    原牛角源码(修罗bbs)全站程序打包带数据库备份,牛角源码全站数据+全站文件、插件打包分享给大家,有兴趣的可以搭建玩玩! conf文件夹中自己配置数据库链接文件,默认管理账号:admin,密码123456 首页登录后就可以...

    牛角座封装规格

    之前一直在找牛角座等各种插座的规格封装,很难找到,最后找到了

    elasticsearch5.3集成java所需jar包

    在Java开发中,Elasticsearch是一个非常重要的搜索引擎和分析引擎,它基于Lucene构建,提供了分布式、全文检索、实时分析的高性能数据存储解决方案。在Elasticsearch 5.3版本中,为了使其能够正常运行,我们需要集成...

    牛角座接口接线方式及管脚对应

    ### 牛角座接口接线方式及管脚对应 #### 标准的牛角座接口接线方式及管脚对应 牛角座接口作为一种广泛应用于电子设备中的连接器,其标准化的设计确保了不同设备间的兼容性和可靠性。本文将详细介绍牛角座接口(以...

    原牛角源码(修罗bbs)程序打包带数据库备份源码

    - `robots.txt`:这是一个告诉搜索引擎爬虫哪些页面可以抓取,哪些不应抓取的文件,对于SEO(搜索引擎优化)有一定的影响。 - `sitemap.xml`:网站地图文件,列出网站的主要页面,有助于搜索引擎更好地理解和索引...

    简易牛角座.IntLib

    简易牛角座.IntLib

    饥荒控制台代码大全.doc

    《饥荒控制台代码大全》是一份详细的文档,旨在帮助新手玩家在《饥荒》这款生存游戏中快速获取必要的资源和物品。控制台代码是游戏中的一个实用功能,通过输入特定的代码,玩家可以瞬间获得想要的道具,从而提高游戏...

    牛角弯头三维CAD展开放样.pdf

    在钣金加工领域中,牛角弯头是一种特殊的弯管部件,主要用于输送管道系统中,以便连接不同直径的管道或调整管道方向。牛角弯头通常由多个圆锥形的管节组成,每个管节都有一定的弯曲角度和长度。由于其结构的复杂性,...

    饥荒控制台物品和模式代码大全83143.pdf

    在游戏中,玩家可以使用控制台输入代码来快速获取游戏中的物品和模式,本文档总结了各种物品和模式的代码,帮助玩家快速获取游戏中的资源。 DebugSpawn 代码 ---------------- DebugSpawn 是一个非常有用的代码,...

Global site tag (gtag.js) - Google Analytics